整形数快速幂

整形数快速幂:

计算整形数的幂的普通算法时间复杂度为O(N),快速幂的时间复杂度为O(log N)。

基本思想:

以x^10 为例:可以看做(x^5)^2,还可以继续拆分为:(x*(x^2)^2)^5;

1. m=n/2。 假设已经知道如何计算xm,再来求xn

2. 分两种情况:

如果n为偶数,xn=(xm)2

如果n为奇数,xn=x(xm)2

根据这个思想,可以得出递归的算法

伪代码:

 

我们推导出迭代的算法

推导过程:

 

求实数xn次方法:

1. n表示为二进制dk,dk-1,...d0。n=2k+2k-1+...+20

2. y=1.

3. 从左到右扫描二进制数字,如果当前数字为0y赋值y2,如果当前数字为1y赋值xy2

伪代码:

 



具体实现代码:

#include<iostream>
using namespace std;
int Pow(int a,int m){
	int temp;
	temp = 1;
	while(m){
		if(m&1){
			temp*=a;
		}
		a*=a;
		m/=2;
	}
	return temp;
} 
int main(){
	int n,m;
	cin>>n>>m;
	cout<<Pow(n,m);
	return 0;
} 

幂数较大,最终结果超出整数范围:

#include<iostream>
using namespace std;
int a[10000];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	a[0] = 1;
	int len=1,jin=0;
	for(int i = 1;i <= m;i++){
		for(int j = 0;j < len;j++){
			int temp = a[j]*n+jin;
			a[j] = temp%10;
			jin = temp/10;
		}
		while(jin){
			a[len++] = jin%10;
			jin /= 10;
		}
	}
	for(int i = len-1;i>=0;i--){
		printf("%d",a[i]);
	}
	return 0;
} 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值