给定实数a和非负整数n,用分治法设计求a的n次幂的快速算法
1.当a=0时,0的任何次幂都等于0
2.当n=0时,任何数的0次幂都等于1
3.当n>0且n为偶数时,可以直接将a的n次幂分为a的n/2次幂✖a的n/2次幂。
4.当n>0且n为奇数时,可以将a的n次幂分为a的n/2次幂✖a的n/2次幂✖a(eg:2的3次幂=2的1次幂✖2的1次幂✖2)
最终代码(递归):
cs
#include<stdio.h>
//快速幂算法
double counting(double a,int n) {
if (a==0) {
return 0;
}
if (n<=0) {
return 1;
}
else {
double mid = counting(a,n/2);
if (n%2) {
return mid * mid * a;
}
else {
return mid * mid;
}
}
}
int main() {
double a;
int n;
printf("请输入底数的值:");
scanf_s("%lf",&a);
printf("请输入指数的值:");
scanf_s("%d",&n);
double result=counting(a,n);
printf("%f的%d次幂等于%f",a,n,result);
return 0;
}
最终代码:(非递归)
cs
#include<stdio.h>
//快速幂算法
int counting(double a,int n) {
double b = a;
double s = 1.0;
int i = n;
while (i > 0) {
if (i % 2) s *= b;//当i%2=1时,才会有s=b的1次方,后续再乘以b的4次方(8,16,64次方)
i /= 2;//i每除于2就是去掉第一个已经乘过的数(eg:第一次乘了b,就去掉a的1次方)
b *= b;//二进制中,前面的每一位都是后面一位的平方
}
return s;
}
int main() {
double a;
int n;
printf("请输入底数的值:");
scanf_s("%lf", &a);
printf("请输入指数的值:");
scanf_s("%d", &n);
double result = counting(a,n);
printf("%f的%d次幂的值为%f",a,n,result);
return 0;
}