方法1:直接求解,但是要注意特殊情况的处理:即当指数为负,且底数为0的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include<iostream> using namespace std; template < typename T> T myPow(T a, int m){ double base = 1; int flag = (m < 0) ? -1 : 1; int n = (m < 0) ? -m : m; while (n > 0){ base = base * a; n --; } if (flag == -1){ if (a != 0){ return (1/base); } cout<< "当指数为负时,0不能作为底数!" <<endl; exit (-1); } return base; } int main(){ double a = 0; // int a = 2; int n = 10; cout<< "求" <<a<< "的" <<n<< "次方为:" <<myPow(a, n)<<endl; system ( "pause" ); return 0; } |
方法2:可以归纳出下面的公式进行求解,使得循环次数大幅减小。也要注意特殊情况的处理:即当指数为负,且底数为0的情况。
an/2*an/2 n为偶数
an =
a(n-1)/2*a(n-1)/2*a n为奇数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include<iostream> using namespace std; // 符号处理(符号处理放在递归方法中出现问题,所以拿了出来) template < typename T> double myPow1(T a, int m){ int flag = (m < 0) ? -1 : 1; int n = (m < 0) ? -m : m; double result = myPow2(a, n, flag); cout<<result<<endl; if (flag == -1){ if (a != 0){ return (1/result); } cout<< "当指数为负时,0不能作为底数!" <<endl; exit (-1); } return result; }<br> template < typename T> T myPow2(T a, int n, int flag){ double result; if (n == 0){ return 0; } if (n == 1){ return a; } if (n%2 == 0){ result = myPow2(a, n/2, flag) * myPow2(a, n/2, flag); } else { result = myPow2(a, (n-1)/2, flag) * myPow2(a, (n-1)/2, flag) * myPow2(a, 1, flag); } return result; } int main(){ double a = 0; // int a = 2; // int n = 8; int n = -10; cout<< "求" <<a<< "的" <<n<< "次方为:" <<myPow1(a, n)<<endl; system ( "pause" ); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步