数值的整数次方

Posted 三颗心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数值的整数次方相关的知识,希望对你有一定的参考价值。

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

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

  1. 0的0次方在数学上是没有意义的,因此无论是输出1还是0都是可以接受的,本题选择输出1
  2. 0的负数次方相当于0作为除数,也是无意义的,非法输入
  3. base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒数
  4. 判断double类型的base是否等于0不能使用==号。因为计算机表述小树(包括float和double型小数)都有误差,不能直接使用等号(==)判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个double类型的数相等。

根据以上4个注意点,我们可以写出求指数的程序,代码如下: 

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 
 5 //全局变量,测试时检查它,用于判断输入正确与否 
 6 bool g_InvalidInput = false;
 7 
 8 //由于精度原因,double类型的变量不能用等号判断两个数是否相等,因此需要写equsl函数
 9 bool equal(double num1, double num2)
10 {
11     if((num1 - num2)>-0.0000001 && (num1 - num2) < 0.0000001)
12         return true;
13     else
14         return false;
15 }
16 
17 //方法1采用循环  
18 double PowerWithUnsignedExponent(double base, unsigned int exponent)
19 {
20     double result = 1.0;
21     for(int i = 1; i<=exponent; ++i)
22         result *= base;
23 
24     return result;
25 }
26 
27 //方法2 采用递归 
28 double PowerWithUnsignedExponent1(double base, unsigned int exponent)
29 {
30     if(exponent == 0)
31         return 1;
32     if(exponent == 1)
33         return base;
34 
35     //位运算代替除以2,位运算的效率比乘除法及求余运算的效率要高很多 
36     double result = PowerWithUnsignedExponent1(base, exponent >> 1);
37     result *= result;
38 
39     if(exponent & 0x1 == 1) //位与,代替求余%来判断一个数是奇数还是偶数 
40         result *= base;
41         
42     return result ;
43 }
44 
45 double Power(double base, int exponent)
46 {
47     g_InvalidInput = false;
48 
49     //如果底数为0且指数小于0,则表明是非法输入。
50     if(equal(base, 0.0) && exponent < 0)
51     {
52         g_InvalidInput = true;   //此时全局变量变为true 
53         cout<<"invalid input"<<ends;
54         return 0.0;
55     }
56     
57     //判断指数正负,取指数的绝对值
58     unsigned int absExponent = (unsigned int)exponent;
59     if(exponent < 0)
60         absExponent = (unsigned int)(- exponent);
61             
62     //此处选择使用方法2,使用方法1的话改下代码就可以了。 
63     double result = PowerWithUnsignedExponent1(base, absExponent);
64     
65     //如果指数小于0则取倒数
66     if(exponent < 0)
67         result = 1.0 / result;
68 
69     return result;
70 }
71 int main()
72 {
73     double num1=Power(2.0,-2);  //0.25
74     double num2=Power(2.0, 2);  //4
75     double num3=Power(0.0, 2);  //0
76     double num4=Power(0.0, 0);  //无意义,这里选择输出1 
77     
78     cout<<num1<<endl;
79     cout<<num2<<endl;
80     cout<<num3<<endl;
81     cout<<num4<<endl;
82     
83     cout<<endl;
84     
85     //无效输入 返回0 
86     double num5=Power(0, -2);
87     cout<<num5<<endl;
88 
89     return 0 ;
90 }

 

以上是关于数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章

16 数值的整数次方 (第3章 高质量的代码)

剑指offer数值的整数次方

算法:数值的整数次方

算法:数值的整数次方

数值的整数次方-剑指Offer

Offer[16] 数值的整数次方