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  }

posted on 2012-08-06 08:06  mycapple  阅读(3339)  评论(0编辑  收藏  举报

导航