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  }

你可能感兴趣的:(HDU)