ACM2035_(递归法求幂)

  /*

编写一个递归算法,求解m的n次方。 

我们一般求解m的n次方,一般使用n个m相乘的办法来求解。

其实我们还可以使用另外一种更有效率的办法求解这个问题。

我们知道一个数的0次方等于1,一个数的1次方等于该数本身。

如果一个数的n次方的n可以被2整数,我们可以将求解的问题,

分解为m的(n/2)次方乘以m的(n/2)次方。如果不能被2整除,

则可以将问题求解转变为m乘以m的(n-1)次方,

通过这个递归的办法,我们可以很快的分解求出问题。

编写代码如下: 

*/

 

unsigned long myPow(int m, int n) 
{ 
  unsigned long tmp; 
  if(n == 0) 
    return 1; 
  if(n == 1) 
    return m; 
  if(n % 2 == 0){ 
    tmp = myPow(m, n/2); 
    return tmp*tmp; 
  } 
  else{ 
    return m*myPow(m, n-1); 
  } 
} 

下面的是AC过的

/*
人见人爱“^ B

时间限制:2000/1000 MS(JAVA /其他)内存限制:三万二千七百六十八分之六万五千五百三十六K(Java /其他的)
总提交(S):16529接受提交():11706


问题说明
求ā^ B的最后三位数表示的整数。
说明:A ^ B的含义是“”的乙次方“
 

输入
B = 0,则表示输入数据的结束,不做处理。
 

产量
对于每个测试实例,请输出A ^乙的最后三位表示的整数,每个输出占一行。
 

采样输入
2 3
12 6
6789 10000
0 0
 

样本输出
8
984
1*/
#include<stdio.h>
int f(int m, int n, int p)
{
    int k;
    if(n==1) return m%p;
     k=f(m,n/2,p);
     return (k*k*(n%2?m%p:1))%p;
}
int main()
{ 
    int m,n;
    while(scanf("%d%d",&m,&n),n||m)
        printf("%d\n",(f(m,n,1000))%1000);
    return 0;
}

 

posted @ 2013-07-11 15:29  退之  阅读(474)  评论(0编辑  收藏  举报