快速幂算法

给定实数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;
}
相关推荐
平生不喜凡桃李12 分钟前
LeetCode 两数之和/三数之和
算法·leetcode·两数之和·三数之和
C雨后彩虹13 分钟前
中文分词模拟器
java·数据结构·算法·华为·面试
BLi4ee14 分钟前
【Scholarly Notes】Adaptive Model Pruning for Federated Learning
算法·机器学习·剪枝
Remember_99320 分钟前
【LeetCode精选算法】二分查找专题二
java·数据结构·算法·leetcode·哈希算法
We་ct40 分钟前
LeetCode 42. 接雨水:双指针解法深度剖析与全方法汇总
前端·算法·leetcode·typescript
液态不合群1 小时前
如何提升 C# 应用中的性能
开发语言·算法·c#
诗远Yolanda1 小时前
EI国际会议-通信技术、电子学与信号处理(CTESP 2026)
图像处理·人工智能·算法·计算机视觉·机器人·信息与通信·信号处理
程序员-King.1 小时前
day165—递归—最长回文子序列(LeetCode-516)
算法·leetcode·深度优先·递归
BHXDML1 小时前
推导神经网络前向后向传播算法的优化迭代公式
神经网络·算法·机器学习
2401_841495641 小时前
【LeetCode刷题】删除链表的倒数第N个结点
数据结构·python·算法·leetcode·链表·遍历·双指针