实现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 ...
随机推荐
- shell 命名管道,进程间通信
命名管道基础 命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写! 命名管道特点: 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞 当读取管道中的数 ...
- Swift入门教程:基本语法大全
原文:Swift入门教程:基本语法大全 简介: ...
- mysql 千分位 Format
原文:mysql 千分位 Format select Format(123456789) 结果:123,456,789
- Java泛型解析(03):虚拟机运行泛型代码
Java泛型解析(03):虚拟机运行泛型代码 Java虚拟机是不存在泛型类型对象的,全部的对象都属于普通类,甚至在泛型实现的早起版本号中,可以将使用泛型的程序编译为在1.0虚拟机上可以执行的 ...
- Net社区虚拟大会
微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新.开源.跨平台 去年 11 月的时候,微软开源了 .NET CoreFX,然后是今年 2 月份的 .NET CoreCL ...
- asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化
原文:asp.net mvc3 数据验证(二)--错误信息的自定义及其本地化 一.自定义错误信息 在上一篇文章中所做的验证,在界面上提示的信息都是系统自带的,有些读起来比较生硬.比如: ...
- JSP+Java+properties+FileInputStream文件读写,JSP页面读取properties文件
String realPath = request.getRealPath("WEB-INF/classes/com/properties/devicetype.properties&quo ...
- Docker运行 Mono
Docker运行 Mono Docker 是最近相当热门的一个名词,它是一个基于 Linux Container 的轻量化的虚拟技术,而微软也相当积极与 Docker 合作,在 Azure 上支持这个 ...
- C#在outlook里创建一封邮件到草稿箱
原文:C#在outlook里创建一封邮件到草稿箱 1.引用Microsoft.Office.Interop.Outlook.dll 2. 实现代码 public static int SendToD ...
- JS中通过call方法实现继承
原文:JS中通过call方法实现继承 讲解都写在注释里面了,有不对的地方请拍砖,谢谢! <html xmlns="http://www.w3.org/1999/xhtml"& ...