校招面试 之 剑指offer第16题 数值的整数次方
Posted xuelisheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了校招面试 之 剑指offer第16题 数值的整数次方相关的知识,希望对你有一定的参考价值。
方法1:直接求解,但是要注意特殊情况的处理:即当指数为负,且底数为0的情况。
#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为奇数
#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; }
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; }
以上是关于校招面试 之 剑指offer第16题 数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章