实现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 ...
随机推荐
- AngularJS 疑难问题解决汇总
AngularJS 防止页面闪烁的方法 angularjs filter 详解 学习资料1 学习资料2 在 AngularJS 应用中处理单选框和复选框 学习资料3 AngularJS 之 Facto ...
- 【百度地图API】今日小年大进步,齐头共进贺佳节——API优化升级上线,不再增加内存消耗
原文:[百度地图API]今日小年大进步,齐头共进贺佳节--API优化升级上线,不再增加内存消耗 任务描述: 今天是2011年01月26日,小年夜.百度地图API在小年夜献给广大API爱好者一份给力的礼 ...
- input的width和padding-left同时存在时IE兼容问题
总的来说,text-indent不影响元素的最终宽度但是有兼容性问题,padding-left在中国主流浏览器IE低版本下影响最终宽度,但在chrome和firefox下不影响宽度,但是可以通过CSS ...
- hust1384---The value of F[n]
Description For any integer i>=3 we have F[i]=(F[i-1]+2*F[i-2]+3*F[i-3])%9901; Now give you F[0], ...
- Hack 语言学习/参考---1.1 What is Hack?
What is Hack?¶ Hack is a language for HHVM that interopates seamlessly with PHP. The barrier to entr ...
- PDF.NET SOD Ver 5.1完全开源
PDF.NET SOD Ver 5.1完全开源 前言: 自从我2014年下半年到现在的某电商公司工作后,工作太忙,一直没有写过一篇博客,甚至连14年股票市场的牛市都错过了,现在马上要过年了,而今天又是 ...
- android学习8(ListView高级使用)
ListView在android更开放的,于是继续ListView说明使用. 首先创建一个android项目,项目名为ListViewTest. ListView的简单使用 改动布局文件,改动后代码例 ...
- C# 之 托付
托付(delegate) 托付是一种能够把引用存储为函数的类型.托付也能够看成是一种数据类型,能够用于定义变量,但它是一种特殊的数据类型,它所定义的变量能接受的数值仅仅能是一个函数,更确切的说 ...
- [C#][ASP.net] 透过WebBrowser 取得AJAX 后的网页
原文[C#][ASP.net] 透过WebBrowser 取得AJAX 后的网页 今天 Shih-Min 问我说,假设网页一开始是AJAX 会载入一些资料,但是透过WebClient 去抓 抓到都是J ...
- 第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...