ACM2035_(递归法求幂)

时间:2023-03-08 17:42:51

/*

编写一个递归算法,求解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 == )
return ;
if(n == )
return m;
if(n % == ){
tmp = myPow(m, n/);
return tmp*tmp;
}
else{
return m*myPow(m, n-);
}
}

下面的是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==) return m%p;
k=f(m,n/,p);
return (k*k*(n%?m%p:))%p;
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n),n||m)
printf("%d\n",(f(m,n,))%);
return ;
}