问题1:实现pow(int x, int y) ,即x的y次方

x的y次方就是有y个x连续乘机,代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int my_pow(int x,int y){
  5. if(x==) return ;
  6. int ret=x,i=;
  7. for(;i<y;i++){
  8. ret=ret*x;
  9. printf("y=%d;ret=%d\n",i+,ret);
  10. }
  11. return ret;
  12. }
  13.  
  14. int main(){
  15. int tmp = my_pow(,);
  16. printf("====%d\n",tmp);
  17. return ;
  18. }

结果

  1. [root@admin Desktop]# ./a.out
  2. y=;ret=
  3. y=;ret=
  4. y=;ret=
  5. y=;ret=
  6. y=;ret=
  7. y=;ret=
  8. y=;ret=
  9. y=;ret=
  10. y=;ret=
  11. ====
  12. [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;

以下通过递归方式实现以上思想:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <limits.h>
  5.  
  6. long double fun(long double x,long double y)
  7. {
  8. printf("ret is x=%Lf ; y=%Lf\n",x,y);//long double输出用%Lf
  9. assert(x != && y >= );
  10. if( == y) return ;
  11. if( == y) return x;
  12. if( == y) return x*x;
  13. long double tmp = ;
  14. if(y/ != ) tmp = x*fun(x,y-);
  15. else tmp = fun(x*x,y/);
  16. if(tmp>){ //如果越界可能出现负数,至于如何更合理判断越界情况,现在还没想好
  17. printf("TMP > 0 IS: %Lf\n",tmp);
  18. return tmp;
  19. }
  20. else{
  21. printf("TMP < 0 IS: %Lf\n",tmp);
  22. return ;
  23. }
  24. }
  25.  
  26. int main(){
  27. long double ret = fun(,);
  28. printf("result = %Lf\n",ret);
  29. return ;
  30. }

看看洋气的输出结果:

  1. [root@admin Desktop]# ./a.out
  2. ret is x=10.000000 ; y=30.000000
  3. ret is x=10.000000 ; y=29.000000
  4. ret is x=10.000000 ; y=28.000000
  5. ret is x=10.000000 ; y=27.000000
  6. ret is x=10.000000 ; y=26.000000
  7. ret is x=10.000000 ; y=25.000000
  8. ret is x=10.000000 ; y=24.000000
  9. ret is x=10.000000 ; y=23.000000
  10. ret is x=10.000000 ; y=22.000000
  11. ret is x=10.000000 ; y=21.000000
  12. ret is x=10.000000 ; y=20.000000
  13. ret is x=10.000000 ; y=19.000000
  14. ret is x=10.000000 ; y=18.000000
  15. ret is x=10.000000 ; y=17.000000
  16. ret is x=10.000000 ; y=16.000000
  17. ret is x=10.000000 ; y=15.000000
  18. ret is x=10.000000 ; y=14.000000
  19. ret is x=10.000000 ; y=13.000000
  20. ret is x=10.000000 ; y=12.000000
  21. ret is x=10.000000 ; y=11.000000
  22. ret is x=10.000000 ; y=10.000000
  23. ret is x=10.000000 ; y=9.000000
  24. ret is x=10.000000 ; y=8.000000
  25. ret is x=10.000000 ; y=7.000000
  26. ret is x=10.000000 ; y=6.000000
  27. ret is x=10.000000 ; y=5.000000
  28. ret is x=10.000000 ; y=4.000000
  29. ret is x=10.000000 ; y=3.000000
  30. ret is x=10.000000 ; y=2.000000
  31. TMP > IS: 1000.000000
  32. TMP > IS: 10000.000000
  33. TMP > IS: 100000.000000
  34. TMP > IS: 1000000.000000
  35. TMP > IS: 10000000.000000
  36. TMP > IS: 100000000.000000
  37. TMP > IS: 1000000000.000000
  38. TMP > IS: 10000000000.000000
  39. TMP > IS: 100000000000.000000
  40. TMP > IS: 1000000000000.000000
  41. TMP > IS: 10000000000000.000000
  42. TMP > IS: 100000000000000.000000
  43. TMP > IS: 1000000000000000.000000
  44. TMP > IS: 10000000000000000.000000
  45. TMP > IS: 100000000000000000.000000
  46. TMP > IS: 1000000000000000000.000000
  47. TMP > IS: 10000000000000000000.000000
  48. TMP > IS: 100000000000000000000.000000
  49. TMP > IS: 1000000000000000000000.000000
  50. TMP > IS: 10000000000000000000000.000000
  51. TMP > IS: 100000000000000000000000.000000
  52. TMP > IS: 1000000000000000000000000.000000
  53. TMP > IS: 10000000000000000000000000.000000
  54. TMP > IS: 100000000000000000000000000.000000
  55. TMP > IS: 1000000000000000000000000000.000000
  56. TMP > IS: 9999999999999999999731564544.000000
  57. TMP > IS: 99999999999999999997315645440.000000
  58. TMP > IS: 999999999999999999955976585216.000000
  59. result = 999999999999999999955976585216.000000
  60. [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. ArcGIS网络分析之Silverlight客户端最近设施点分析(四)

    原文:ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 在上一篇中说了如何实现最近路径分析,本篇将讨论如何实现最近设施点分析. 最近设施点分析实际上和路径分析有些相识,实现的过程 ...

  2. 教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题)

    原文:教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题) 之前发布过Silver ...

  3. [CLR via C#]5.4 对象哈希码和dynamic基元类型

    原文:[CLR via C#]5.4 对象哈希码和dynamic基元类型 FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处.为此,System.Object提供了虚方 ...

  4. centos7看电影

    sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm sudo rpm ...

  5. J2EE之验证码实现

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

  6. Silverlight 雷达图和一种特殊泡泡画法

    原文:Silverlight 雷达图和一种特殊泡泡画法 自上次发了雷达图,也没怎么说一下. 这次又做了一种图,继续共享一下,就是以一个点为中心,周围绕着几个点,用一个箭头与中心相连并带有某些信息.圆 ...

  7. orleans开篇之hello world

    orleans开篇之hello world 什么是orleans Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务.Orleans项目基本上被认为是并行计 ...

  8. Android开发:怎样定制界面风格

    统一的用户界面是可以使得应用程序更友好.要做到用户界面的统一,我们就必须用到风格(style)和主题(theme).OPhone系统提供了很多系统默认的风格和主题,但是很多情况下,这些不能满足我们的需 ...

  9. ios 8 地图定位

    在xcode6在 苹果公司定位方法改变地图,谁也无法使用 错误说明:Trying to start MapKit location updates without prompting for loca ...

  10. Fedora 20中解决zip解压文件时中文文件名的乱码问题[已解决]

    该方法的原文地址: http://wangqige.com/the-solution-of-unzip-files-which-zip-under-windows/(链接已失效) 解决方法:保存如下P ...