題目連接: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 }