快速幂算法

给定实数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;
}
相关推荐
Eward-an2 小时前
LeetCode 1980 题通关指南|3种解法拆解“找唯一未出现二进制串”问题,附Python最优解实现
python·算法·leetcode
程序员酥皮蛋3 小时前
hot 100 第四十题 40.二叉树的层序遍历
数据结构·算法·leetcode
木斯佳4 小时前
HarmonyOS 6实战:从爆款vlog探究鸿蒙智能体提取关键帧算法
算法·华为·harmonyos
Mr.朱鹏4 小时前
JVM-GC垃圾回收案例
java·jvm·spring boot·算法·spring·spring cloud·java-ee
WJSKad12355 小时前
【DepthPro】实战教程:单目深度估计算法详解与应用
算法
wzqllwy5 小时前
8 大经典排序算法(Java 实现):原理 + Demo + 核心分析
java·算法·排序算法
We་ct5 小时前
LeetCode 77. 组合:DFS回溯+剪枝,高效求解组合问题
开发语言·前端·算法·leetcode·typescript·深度优先·剪枝
重生之我是Java开发战士5 小时前
【递归、搜索与回溯】二叉树中的深度优先搜索:布尔二叉树,求根节点到叶节点数字之和,二叉树剪枝,验证二叉搜索树,第K小的元素,二叉树的所有路径
算法·深度优先·剪枝
篮l球场5 小时前
矩阵置零
算法
lihihi5 小时前
P1650 [ICPC 2004 Shanghai R] 田忌赛马(同洛谷2587)
开发语言·算法·r语言