快速幂算法

给定实数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;
}
相关推荐
启观川5 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸5 小时前
排序算法介绍
python·算法·排序算法
动词ing6 小时前
【题目练习】算法 组合总和||
算法
longlongzihan7 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源7 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
liulilittle7 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
Logic1017 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi0117 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
极光通讯8 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
淡海水8 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots