快速幂算法

给定实数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;
}
相关推荐
qq_433554543 分钟前
C++ 二维线性DP
c++·算法·图论
风筝在晴天搁浅6 分钟前
代码随想录 115.不同的子序列
算法
c#上位机12 分钟前
halcon2个区域合并为1个区域—union2
图像处理·算法·计算机视觉·halcon
程序员-King.19 分钟前
双指针/滑动窗口—算法总结与教学指南
经验分享·算法·双指针
小武~33 分钟前
Leetcode 每日一题C 语言版 -- 274 H-index
c语言·算法·leetcode
0 0 037 分钟前
CCF-CSP 36-3 缓存模拟(cache)【C++】
开发语言·c++·算法
蒟蒻小袁37 分钟前
Hot100--找到字符串中所有字母异位词
java·算法·leetcode·面试
kingmax5421200843 分钟前
高中数学教师资格面试试讲稿:《直线的位置关系(例2)》
线性代数·算法·面试·矩阵·教师资格
吃着火锅x唱着歌44 分钟前
LeetCode 2909.元素和最小的山形三元组II
数据结构·算法·leetcode
小O的算法实验室1 小时前
2026年SEVC SCI2区,基于k均值聚类和自适应双群策略的粒子群算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进