数值的整数次方
题目描述:
给定一个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 }