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;
}
当然快速幂不只是用在数中,在矩阵中还会用到快速幂的用法
浙公网安备 33010602011771号