12、剑指offer--数值的整数次方

题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 
解题思路:首先要注意特殊情况的处理   base为0情况  exponent为0 为1情况  exponent为负数情况
 1 #include <iostream>
 2 using namespace std;
 3 class Solution {
 4 public:
 5     //要注意的几点
 6     //1、base == 0
 7     //2、exponent == 0;==1
 8     //3、exponent 为负数
 9     double Power(double base, int exponent) {
10         if(equal(base,0.0))
11         {
12             return 0.0;
13         }
14         unsigned int abExponent = (unsigned int)(exponent);//一定要注意此处给其赋值,否则如果exponent不小于0时,该值随机,会出现错误
15         if(exponent < 0)
16             abExponent = (unsigned int)(-exponent);
17         double result = 1.0;
18         for(int i=1;i<=abExponent;i++)
19         {
20             result *= base;
21         }
22         if(exponent<0)
23             return 1.0/result;
24         else
25             return result;
26 
27 
28     }
29     bool equal(double num1,double num2)
30     {
31         if((num1-num2)>-0.0000001 && (num1-num2)<0.0000001)
32         {
33             return true;
34         }
35         else
36             return false;
37     }
38     //方法二:a^n = a^(n/2)*a^(n/2)   n为偶数
39     //        a^n = a^(n/2)*a^(n/2)*a n为奇数
40     double Power2(double base, int exponent) {
41         if(equal(base,0.0))
42         {
43             return 0.0;
44         }
45         if(exponent == 0)
46             return 1.0;
47         else if(exponent == 1)
48             return base;
49         unsigned int abExponent = (unsigned int)(exponent);
50         if(exponent < 0)
51             abExponent = (unsigned int)(-exponent);
52         double result = Power2(base,abExponent>>1);//右移1相当于除以2
53         result *= result;//a^(n/2)*a^(n/2);
54         if(abExponent & 0x1 == 1)//奇数
55         {
56             result *= base;
57         }
58         if(exponent < 0)
59             return 1.0/result;
60         else
61             return result;
62     }
63 };
64 int main()
65 {
66     double n ;
67     int x;
68     while(cin>>n>>x)
69     {
70         Solution s;
71         cout<<"调用方法一:"<<n<<""<<x<<"次方为:"<<s.Power(n,x)<<endl;
72         cout<<"调用方法二:"<<n<<""<<x<<"次方为:"<<s.Power2(n,x)<<endl;
73     }
74     return 0;
75 }

程序运行结果:

posted @ 2017-05-11 10:18  qqky  阅读(160)  评论(0编辑  收藏  举报