实现pow(int x, int y),即x的y次方 ; 异或交换两个数;
问题1:实现pow(int x, int y) ,即x的y次方
x的y次方就是有y个x连续乘机,代码如下:
- #include <stdio.h>
- #include <stdlib.h>
- int my_pow(int x,int y){
- if(x==) return ;
- int ret=x,i=;
- for(;i<y;i++){
- ret=ret*x;
- printf("y=%d;ret=%d\n",i+,ret);
- }
- return ret;
- }
- int main(){
- int tmp = my_pow(,);
- printf("====%d\n",tmp);
- return ;
- }
结果
- [root@admin Desktop]# ./a.out
- y=;ret=
- y=;ret=
- y=;ret=
- y=;ret=
- y=;ret=
- y=;ret=
- y=;ret=
- y=;ret=
- y=;ret=
- ====
- [root@admin Desktop]#
改进:
1.我们发现上面的方法,如果y=100,则乘法计算要进行100次,复杂度较高;
2.我们能否利用上次的计算结果,来简化计算?
比如2^4,用2*2*2*2=4*2*2=8*2=16;
上式中共进行了三次乘法;
把所有重复计算剔除:2^4=2^2*2^2=4*4=16,该过程共计算两次乘法2^2,4*4;
乘法次数由3次降为2次;
3.幂运算往往容易越界,比如int最大能表示2147483647,如果算出结果超出这个范围就出错了。
1.对越界做判断和检查;
2.用合适的数据类型表示结果,貌似C里最大的整形数应该是long double;
以下通过递归方式实现以上思想:
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <limits.h>
- long double fun(long double x,long double y)
- {
- printf("ret is x=%Lf ; y=%Lf\n",x,y);//long double输出用%Lf
- assert(x != && y >= );
- if( == y) return ;
- if( == y) return x;
- if( == y) return x*x;
- long double tmp = ;
- if(y/ != ) tmp = x*fun(x,y-);
- else tmp = fun(x*x,y/);
- if(tmp>){ //如果越界可能出现负数,至于如何更合理判断越界情况,现在还没想好
- printf("TMP > 0 IS: %Lf\n",tmp);
- return tmp;
- }
- else{
- printf("TMP < 0 IS: %Lf\n",tmp);
- return ;
- }
- }
- int main(){
- long double ret = fun(,);
- printf("result = %Lf\n",ret);
- return ;
- }
看看洋气的输出结果:
- [root@admin Desktop]# ./a.out
- ret is x=10.000000 ; y=30.000000
- ret is x=10.000000 ; y=29.000000
- ret is x=10.000000 ; y=28.000000
- ret is x=10.000000 ; y=27.000000
- ret is x=10.000000 ; y=26.000000
- ret is x=10.000000 ; y=25.000000
- ret is x=10.000000 ; y=24.000000
- ret is x=10.000000 ; y=23.000000
- ret is x=10.000000 ; y=22.000000
- ret is x=10.000000 ; y=21.000000
- ret is x=10.000000 ; y=20.000000
- ret is x=10.000000 ; y=19.000000
- ret is x=10.000000 ; y=18.000000
- ret is x=10.000000 ; y=17.000000
- ret is x=10.000000 ; y=16.000000
- ret is x=10.000000 ; y=15.000000
- ret is x=10.000000 ; y=14.000000
- ret is x=10.000000 ; y=13.000000
- ret is x=10.000000 ; y=12.000000
- ret is x=10.000000 ; y=11.000000
- ret is x=10.000000 ; y=10.000000
- ret is x=10.000000 ; y=9.000000
- ret is x=10.000000 ; y=8.000000
- ret is x=10.000000 ; y=7.000000
- ret is x=10.000000 ; y=6.000000
- ret is x=10.000000 ; y=5.000000
- ret is x=10.000000 ; y=4.000000
- ret is x=10.000000 ; y=3.000000
- ret is x=10.000000 ; y=2.000000
- TMP > IS: 1000.000000
- TMP > IS: 10000.000000
- TMP > IS: 100000.000000
- TMP > IS: 1000000.000000
- TMP > IS: 10000000.000000
- TMP > IS: 100000000.000000
- TMP > IS: 1000000000.000000
- TMP > IS: 10000000000.000000
- TMP > IS: 100000000000.000000
- TMP > IS: 1000000000000.000000
- TMP > IS: 10000000000000.000000
- TMP > IS: 100000000000000.000000
- TMP > IS: 1000000000000000.000000
- TMP > IS: 10000000000000000.000000
- TMP > IS: 100000000000000000.000000
- TMP > IS: 1000000000000000000.000000
- TMP > IS: 10000000000000000000.000000
- TMP > IS: 100000000000000000000.000000
- TMP > IS: 1000000000000000000000.000000
- TMP > IS: 10000000000000000000000.000000
- TMP > IS: 100000000000000000000000.000000
- TMP > IS: 1000000000000000000000000.000000
- TMP > IS: 10000000000000000000000000.000000
- TMP > IS: 100000000000000000000000000.000000
- TMP > IS: 1000000000000000000000000000.000000
- TMP > IS: 9999999999999999999731564544.000000
- TMP > IS: 99999999999999999997315645440.000000
- TMP > IS: 999999999999999999955976585216.000000
- result = 999999999999999999955976585216.000000
- [root@admin Desktop]#
显然后面的结果不对,但是没有出现负数的情况。疑惑,烦请高人指点一二。
问题2:异或交换两个数
假设x=2;y=3,我们的目标是(没有蛀牙!!)交换x,y的值;
利用异或的特殊性:x^x=0
即两个相同数字异或后值为0;
解决:
令x=x^y=2^3
令y=x^y=x^y^y=2^3^3=2(此时x=x^y)
令x=x^y=x^y^2=2^3^2=3(此时x=x^y;y=2)
实现pow(int x, int y),即x的y次方 ; 异或交换两个数;的更多相关文章
- CAST function should support INT synonym for SIGNED. i.e. CAST(y AS INT)
Login / Register Developer Zone Bugs Home Report a bug Statistics Advanced search Saved searches T ...
- leetcode Pow(doubule x,int n)
今天第一天开通博客,心情还是小激动的 上代码: 方法一:常规递归,x的n次方={xn/2*xn/2 //n为偶 xn/2*xn/2 *x //n为奇数 } ...
- /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数
/** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...
- 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl
因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...
- 第二次作业#include <stdio.h> int main() { int a,b,c,d,e; printf("请输入一个不多于五位的整数:\n"); scanf("%d",&a); if(a>=100000||a<=0) { printf("输入格式错误! \n"); } else { if(
1 判断成绩等级 给定一百分制成绩,要求输出成绩的等级.90以上为A,80-89为B,70-79为C,60-69为D,60分以下为E,输入大于100或小于0时输出"输入数据错误". ...
- jni java和C之间的值传递(int String int[])
我们通过jni调用C代码不可能每次只是去调一个方法,通常,我们需要传递一些值过去. 例如,播放电影,那就肯定需要你把电影的 url给 C的播放器吧,等等. 接下来就看一看怎么去传递这些值: 首先是最简 ...
- HSSFClientAnchor(int dx1,int dy1,int dx2,int dy2,short col1,int row1,short col2, int row2)
public HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int ...
- 将int转int数组并将int数组元素处理后转int,实现加密
package faceobject; import java.util.Arrays; public class Test { /** 加密问题 数据是小于8位的整数 先将数据倒序,然后将每位数字都 ...
- 强制类型转换(int)、(int&)和(int*)的区别
我们先来看两行代码: float x=1.75,y=1.75; cout<<(int)x<<" "<<(int&)y<<en ...
随机推荐
- ArcGIS网络分析之Silverlight客户端最近设施点分析(四)
原文:ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 在上一篇中说了如何实现最近路径分析,本篇将讨论如何实现最近设施点分析. 最近设施点分析实际上和路径分析有些相识,实现的过程 ...
- 教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题)
原文:教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题) 之前发布过Silver ...
- [CLR via C#]5.4 对象哈希码和dynamic基元类型
原文:[CLR via C#]5.4 对象哈希码和dynamic基元类型 FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处.为此,System.Object提供了虚方 ...
- centos7看电影
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm sudo rpm ...
- J2EE之验证码实现
package cn.itcast.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; i ...
- Silverlight 雷达图和一种特殊泡泡画法
原文:Silverlight 雷达图和一种特殊泡泡画法 自上次发了雷达图,也没怎么说一下. 这次又做了一种图,继续共享一下,就是以一个点为中心,周围绕着几个点,用一个箭头与中心相连并带有某些信息.圆 ...
- orleans开篇之hello world
orleans开篇之hello world 什么是orleans Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务.Orleans项目基本上被认为是并行计 ...
- Android开发:怎样定制界面风格
统一的用户界面是可以使得应用程序更友好.要做到用户界面的统一,我们就必须用到风格(style)和主题(theme).OPhone系统提供了很多系统默认的风格和主题,但是很多情况下,这些不能满足我们的需 ...
- ios 8 地图定位
在xcode6在 苹果公司定位方法改变地图,谁也无法使用 错误说明:Trying to start MapKit location updates without prompting for loca ...
- Fedora 20中解决zip解压文件时中文文件名的乱码问题[已解决]
该方法的原文地址: http://wangqige.com/the-solution-of-unzip-files-which-zip-under-windows/(链接已失效) 解决方法:保存如下P ...