问题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次方 ; 异或交换两个数;的更多相关文章

  1. 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 ...

  2. leetcode Pow(doubule x,int n)

    今天第一天开通博客,心情还是小激动的 上代码: 方法一:常规递归,x的n次方={xn/2*xn/2              //n为偶 xn/2*xn/2 *x          //n为奇数 } ...

  3. /编写一个函数,要求从给定的向量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:$ */ /* 编写一个 ...

  4. 定义一个复数(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 ...

  5. 第二次作业#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时输出"输入数据错误". ...

  6. jni java和C之间的值传递(int String int[])

    我们通过jni调用C代码不可能每次只是去调一个方法,通常,我们需要传递一些值过去. 例如,播放电影,那就肯定需要你把电影的 url给 C的播放器吧,等等. 接下来就看一看怎么去传递这些值: 首先是最简 ...

  7. 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  ...

  8. 将int转int数组并将int数组元素处理后转int,实现加密

    package faceobject; import java.util.Arrays; public class Test { /** 加密问题 数据是小于8位的整数 先将数据倒序,然后将每位数字都 ...

  9. 强制类型转换(int)、(int&)和(int*)的区别

    我们先来看两行代码: float x=1.75,y=1.75; cout<<(int)x<<" "<<(int&)y<<en ...

随机推荐

  1. Apache conf文件配置个人总结

      其实说到conf文件的配置,网上那必定是大堆大堆的,故今儿写着篇小博文,也只是做个总结,至于分享的价值吗,如果对屏幕前的你有用,我也很乐意啦.   首先,我们要找到Apache安装目录,我的是Ap ...

  2. 利用WebBrowser彻底解决Web打印问题

    原文:利用WebBrowser彻底解决Web打印问题 利用WebBrowser彻底解决Web打印问题(包括后台打印) BS架构下的打印大家是怎么解决的呢,我最近作了一个项目正好负责这一块,不仅要求打印 ...

  3. J2EE之验证码实现

    package cn.itcast.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; i ...

  4. Microsoft dotnetConf 2015

    Microsoft dotnetConf 2015 一些整理   dotnetConf 2015 直播计划: 第一天 (10 个主讲) - .NET Product Teams 主讲人为 .NET 产 ...

  5. POJ 2777 Count Color(线段树+位运算)

    题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...

  6. 移动小bug

    1. 在三星note2,小米2,页面加载后,页面有黑块. 那么提高被盖住的部分z-index. 2. iphone5 ,ios7.0.4,上文字显示不出 那么就先hide,setTimeout几百毫秒 ...

  7. nodejs开发aspnet5项目

    结合nodejs开发aspnet5项目 1.安装kvm   官方教程地址:https://github.com/ligershark/Kulture 打开 powershell命令窗口,找不到可以在开 ...

  8. DEDECMS织梦常用二开自定义标签

    网站名称:{dede:global.cfg_webname/} 网站根网址:{dede:global.cfg_basehost/} 网站根目录:{dede:global.cfg_cmsurl/} 网页 ...

  9. Wowza流媒体Live直播和VOD点播配置实战

    Wowza是当今可以说最流行的流媒体服务器之一,近来因为需要搭建相应的服务器,但又不想用camera等作真实的直播,所以想办法用媒体文件转换成直播流再提供给Wowza进行直播.这里把该设置步骤以及设计 ...

  10. C#通过系统API判断已经连接互联网

    win32   API函数的做法: 要用的函数:InternetGetConnectedState 函数原形:BOOL   InternetGetConnectedState(LPDWORD   lp ...