数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方

 

算法注意事项:

算法并不是很难,但这里要注意对输入的要求进行检查,例如指数是0的情况,底数是0的情况,底数是-1的情况等。所以这里还是要注意很多问题的。下面是代码,从代码中来学习

 1 #include<iostream>
 2 using namespace std;
 3 
 4 bool InvalidInput = false;
 5 /*
 6     这个equal函数需要注意的地方是比较两个double或者float的数时用哪种方法,这里给出了
 7     一种经典的方法, 
 8 */
 9 bool equal(double num1, double num2){
10     
11     if((num1 - num2) < 0.0000001 && (num1 - num2) > -0.0000001){
12         return true;
13     }
14     else{
15         return false;
16     }
17 }
18 
19 /*
20     计算指数值的核心算法 
21 */ 
22 double powerCore(double base, unsigned int exponent){
23     if(exponent == 0){      //如果指数是0,那么无论底数是什么,结果都为1,返回即可 
24         return 1;
25     }
26     if(exponent == 1){      //如果指数是1,那么就返回底数本身,因为任何数的1次方还是本身 
27         return base;
28     }
29 /*
30     递归算法求出结果,这里用到了优化的算法,对指数分奇数和偶数 
31 */ 
32     double result = powerCore(base, exponent >> 1);
33     result *= result;
34     
35     if( (exponent & 0x1) == 1){                 //奇数的情况下,需要再乘以底数 
36         result = result * base;
37     }
38     
39     return result;
40 }
41 
42 double Power(double base, double exponent){
43     InvalidInput = false;
44     
45     if(equal(base, 0.0) && exponent < 0){            //如果底数是0,指数是负数,那么返回标志0.0 
46         InvalidInput = true;
47         return 0.0;
48     }
49     
50     unsigned int absExponent = (unsigned int)(exponent);
51     if(exponent < 0){
52         absExponent = (unsigned int )(-exponent);           //如果指数是负数,需要先将指数转化为正数 
53     }
54     
55     double result = powerCore(base, absExponent);
56     
57     if(exponent < 0){                                       //如果指数是负数,将结果取倒数即可 
58         result = 1.0 / result;
59     }
60     
61     return result;
62 } 
63 
64 int main(){
65     /*
66     写了5组测试的数据 
67     */
68 //    double tags = Power(0, -1);
69 //    double tags = Power(2, -1);
70 //    double tags = Power(-1, 3);
71 //    double tags = Power(2, 3);
72     double tags = Power(9, 0);
73     if(equal(tags, 0.0)){
74         cout<<"The invalid input"<<endl;
75     }
76     else{
77         cout<<"the result is "<<tags<<endl;
78     }
79     
80     return 0;
81 }

 

posted @ 2016-03-27 19:01  Dormant  阅读(278)  评论(0编辑  收藏  举报