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; }
不要让今天成为明天的遗憾!