快速幂算法

给定实数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;
}
相关推荐
爆打维c4 分钟前
01BFS算法(例题:网格传送门旅游)
c语言·c++·python·算法·leetcode·广度优先
像素猎人11 分钟前
力扣:面试题16.01.交换数字
c++·算法·leetcode·面试
小O的算法实验室11 分钟前
2024年ASOC SCI2区TOP,异构 pbest 引导的综合学习粒子群算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
AI科技星34 分钟前
从质能关系到时空几何:光速飞行理论的框架对比与逻辑验证
服务器·人工智能·线性代数·算法·矩阵
CSDN_RTKLIB39 分钟前
C++仿函数
c++·算法·stl
学嵌入式的小杨同学1 小时前
【嵌入式 C 语言高频考点】周测 + 期中真题解析:从基础语法到编程实战
c语言·数据结构·数据库·vscode·算法·面试
沉默-_-1 小时前
力扣hot100双指针专题解析2(C++)
java·c++·算法·蓝桥杯·双指针
福楠1 小时前
C++ | 红黑树
c语言·开发语言·数据结构·c++·算法
丝瓜蛋汤1 小时前
Proof of the contraction mapping theorem
人工智能·算法
We་ct1 小时前
LeetCode 58. 最后一个单词的长度:两种解法深度剖析
前端·算法·leetcode·typescript