面试题11 数值的整数次方

来源:互联网 发布:淘宝多久自己确认收货 编辑:程序博客网 时间:2024/06/10 01:18

题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

题目链接:http://ac.jobdu.com/problem.php?pid=1514

这道题目有以下几点需要注意:

  1. 0的0次方是无意义的,非法输入
  2. 0的负数次方相当于0作为除数,也是无意义的,非法输入
  3. base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒数
  4. 判断double类型的base是否等于0不能使用==号。因为计算机表述小树(包括float和double型小数)都有误差,不能直接使用等号(==)判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个double类型的数相等。
根据以上四个注意点,我们可以写出求指数的程序,代码:
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<iomanip>  
  4. using namespace std;  
  5.   
  6. bool g_Invalid = false;  
  7. //由于计算机表示小数(float,double)都有误差,不能直接用等号(==)来判断两个数是否相等  
  8. //所以若两个数的差的绝对值很小很小,比如小于0.0000001,就可以认为他们是相等的  
  9. bool equal(double num1, double num2)  
  10. {  
  11.     if ((num1 - num2) > -0.000001 && (num1 - num2) < 0.000001)  
  12.         return true;  
  13.     else   
  14.         return false;  
  15. }  
  16. //传进来的exp是>=0的  
  17. double PowerExp(double base, unsigned int exp)  
  18. {  
  19.     if (exp == 0)  
  20.         return 1;  
  21.     if (exp == 1)  
  22.         return base;  
  23.   
  24.     double res = PowerExp(base,exp>>1);  
  25.     res *= res;  
  26.   
  27.     if (exp &0x1 == 1)  
  28.         res *= base;  
  29.   
  30.     return res;  
  31. }  
  32.   
  33. double Power(double base, double exp)  
  34. {  
  35.     g_Invalid = false;  
  36.       
  37.     //0的0次方及0的负数次方都是非法输入  
  38.     if (equal(base,0.0) && exp <= 0)  
  39.     {  
  40.         g_Invalid = true;  
  41.         return 0.0;  
  42.     }  
  43.     //取指数的绝对值  
  44.     unsigned int absExp;  
  45.     if (exp < 0)  
  46.         absExp = (unsigned int)(-exp);  
  47.     else   
  48.         absExp = (unsigned int)(exp);  
  49.       
  50.     double res = PowerExp(base,absExp);  
  51.       
  52.     //指数小于0,则取倒数  
  53.     if (exp < 0)  
  54.         res = 1.0/res;  
  55.   
  56.     return res;  
  57.   
  58. }  
  59. int main()  
  60. {  
  61.     int t, exp;  
  62.     double base, res;  
  63.     while (scanf("%d",&t) == 1)  
  64.     {  
  65.         for (int i = 0; i < t; i++)  
  66.         {  
  67.             scanf("%lf %d",&base,&exp);  
  68.             res = Power(base,exp);  
  69.             //如果非法输入,输出INF  
  70.             if (g_Invalid )  
  71.             {  
  72.                 printf("INF\n");  
  73.                 continue;  
  74.             }  
  75.             //注意输出格式,科学计数法的表示  
  76.             else   
  77.                 printf("%.2ef\n",res);  
  78.         }  
  79.     }  
  80.     return 0;  
  81. }  
0 0
原创粉丝点击