Sweety

Practice makes perfect

导航

快速求幂

Posted on 2014-10-23 20:28  蓝空  阅读(175)  评论(0编辑  收藏  举报

 

HDU 2035 人见人爱A^B(二分求幂,快速求幂):http://acm.hdu.edu.cn/showproblem.php?pid=2035 使用大数据思想在数组中求:

两种垃圾做法:

#include <iostream>
#include <cstdio>
using namespace std;
int main(){

	int m,n;
	while(~scanf("%d %d", &m, &n))
	{
		if(m==0&&n==0)
			break;
		int a[3],b[3],c[3]={0,0,0},i;
		for(i=0;i<3;i++)
		{
			a[i]=b[i]=m%10;
			m=m/10;
		}
		n--;
		while(n--)
		{
			for(i=0;i<3;i++)
				for(int j=0 ; j<3;j++)
				{
					if(j+i<3)
					{
						c[j+i]=a[i]*b[j]+c[j+i];
						if(c[j+i]>9)
						{
							if(i+j+1<=2)
								c[i+j+1]=c[j+i+1]+c[j+i]/10;
							c[i+j]=c[j+i]%10;
						}
					}
				}
			b[0]=c[0],b[1]=c[1],b[2]=c[2];
			c[0]=c[1]=c[2]=0;
		}
		printf("%d\n",b[2]*100+b[1]*10+b[0]);

	}
	return 0;
}


 

#include<iostream>
using namespace std;
int main()
{
		int m,n;
	while(scanf("%d %d", &m, &n)!=EOF)
	{
	
		if(m==0&&n==0)
			break;
		
		m=m%1000;
		int w=m;
		n--;
		while(n--){
		m=m*m%1000;
		}
		cout<<m<<endl;
	}
}



 

 

 相对来说下面的两种还是蛮不错的这应该算是快速幂中的一种吧

二分求幂

#include<iostream>
#include<cstdio>
using namespace std;

int main(){
	int a,b;
	int ans;
	while(~scanf("%d%d",&a,&b)){
		if(a==0&&b==0) break;
		a=a%1000;//底数取余
		ans=1;
		while(b>0){ 
			if(b%2==1)//1.奇数时,多出来的一项提前放到ans里  2.b==1时,完成结果和底数的最后一次相乘
				ans=(ans*a)%1000;//结果取余
			a=(a*a)%1000;//二分操作
			b=b/2;//1.二分  2.b==1时,b/2=0,作为结束循环的条件
		}
		printf("%d\n",ans);
	}
	return 0;
}


 

 

二分求幂(位运算)

#include<iostream>
#include<cstdio>
using namespace std;

int main(){
	int a,b;
	int ans;
	while(~scanf("%d%d",&a,&b)){
		if(a==0&&b==0) break;
		a=a%1000;
		ans=1;
		while(b>0){
			if(b&1)//判断是否为奇数,相当于 if(b%2==1)
				ans=(ans*a)%1000;
			a=(a*a)%1000;
			b=b>>1;//二进制向右移一位,相当于 b=b/2;
		}
		printf("%d\n",ans);
	}
	return 0;
}


 

 

 

 

当然快速幂不只是用在数中,在矩阵中还会用到快速幂的用法

详见网址:http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2fu014665013%2farticle%2fdetails%2f40452065