快速幂算法

给定实数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;
}
相关推荐
样例过了就是过了6 分钟前
LeetCode热题100 全排列
数据结构·c++·算法·leetcode·dfs
2401_898075127 分钟前
分布式系统监控工具
开发语言·c++·算法
程序员夏末13 分钟前
【LeetCode | 第六篇】算法笔记
笔记·算法·leetcode
OKkankan30 分钟前
撕 STL 系列:封装红黑树实现 mymap 和 myset
java·c++·算法
xh didida35 分钟前
数据结构--实现链式结构二叉树
c语言·数据结构·算法
ab15151736 分钟前
3.15二刷基础90、105、106、110
数据结构·c++·算法
C蔡博士36 分钟前
最近点对问题(Closest Pair of Points)
java·python·算法
白太岁38 分钟前
算法:链表:指针变化与环
数据结构·算法·链表
寻寻觅觅☆38 分钟前
东华OJ-进阶题-10-分解质因数(C++)
数据结构·c++·算法
是梦终空1161 小时前
模板编译期机器学习
开发语言·c++·算法