HDU 2035 人见人爱A^B
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2035
法一:每次取余数
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 int n,m,mul; 6 while(~scanf("%d%d",&n,&m)&&(n||m)) 7 { 8 mul=1; 9 while(m--) 10 mul=(mul*n)%1000; 11 printf("%d\n",mul); 12 } 13 system("pause"); 14 return 0; 15 }
法二:其实直接每次取余数就能过的 第一遍就是用这种方法过的 这次算是用二分加速过的吧 就是每次都讲底数平方 指数除以2 要是偶数没问题 要是奇数就在将多余的那部成到sum中(初始值为1) 不停地做循环知道b<=1 最后输出sum*a; 注意b开始不能取余数 否则会因为乘法的次数改变而出错
1 View Code 2 #include<iostream> 3 using namespace std; 4 int ex_pow(int a,long long b) 5 { 6 long long sum; 7 a=a%1000;//a可以取余数 但b千万不要取余数 否则b较大时出错!!!因此WA了两次 8 sum=1; 9 while(b>1) 10 { 11 if(b%2==1) 12 { sum=(sum*a)%1000; 13 14 } 15 else 16 { 17 18 } 19 a=a*a%1000; 20 b=b/2; 21 } 22 return sum%1000*a%1000; 23 } 24 int main() 25 { 26 long long a,b; 27 while(cin>>a>>b) 28 { 29 if(a==0&&b==0) 30 break; 31 a=a%1000; 32 cout<<ex_pow(a,b)<<endl; 33 } 34 // system("pause"); 35 return 0; 36 }