因为作业代码涉及隐私,所以文章只提供解题思路和有关拓展,若实在需要源码可以私信
/* 但是这次太简单直接就发发发了唉 */
作业:
用高效算法自制一个高效率的pow函数, 指数只使用正数 (不包括0,适用于极大的整数)
|| 写在前面:
一个误区更正(一直没注意到...):for循环的第一次执行时不单单要执行初始化语句,同时得满足判断条件才能进入循环
|| 算法一:普普通通
若题目要求使用一个变量表示结果x^a,并直接用该值作为返回值
解题思路:将该变量初始化为1.0
优化思路:将该变量直接初始化为底数x
double myPow(double x, int a){
double res = 1.0;
for(int i = 0; i < a; i++)
res *= x;
return res;
}
/*小优化*/
double myPow(double x, int a){
double res = x;
for(int i = 0; i < a - 1; i++) /*少一次循环*/
res *= x;
return res;
}
|| 算法二(用个递归,运行效率不高不过看起来挺好玩)
解题思路:抽象一下程序第一步即显而易见:
x^10 = x^5 * x^5 / x^11 = x^10 * x 故分两种情况 1,幂乘以幂 2,幂乘以底数自身
//明确函数功能:指定了底数和指数后返回出它的幂
//定好头尾: 尾: 指数被除为0,返回1; 头: 分两种情况 1,幂乘以幂 2,幂乘以底数自身
double myPow(double x, int n, double &res){
if(n == 0) return 1;
if(n % 2 == 0)
return myPow(x, n/2, res) * myPow(x, n/2, res);
else
return x * myPow(x, n-1, res);
}
int main(){
double x = 2;
int a = 11;
double temp = 1.0;
double &tmp = temp;
double result = myPow(x, a, tmp); // 放进值为1的(temp)的引用
printf("%f" , result);
return 0;
}
|| 算法三: 大O:logN ,高效 [夸]
解题思路:x^10 = (x^5) * (x^5); x^5=x^4 * x ; x^4 = x^2 * x^2; ...
double myPow(double x, int n){
double res = 1.0;
while(n){
if(n % 2 == 0){
n = n / 2;
x *= x;
}
else{
n--;
res = res * x;
}
}
return res;
}