快速幂
以前的话快速幂对我来说是个难题,写都写不出来,现在我理解快速幂算法的原理,知道算法的步骤,所以写起来就简单多了,
当你练习的多的时候,自然就会的多了,原来的难题对你来说也会变得不算什么,所以,加油,多练习,做一题,会一类题;
举个例子算3^10,变成3^(2^0*0 + 2^1*1 + 2^2*0 + 2^3*1), 也就是3^(2^1 + 2^3), 即3^2 * 3 ^8;
即10变成二进制后就是1010,
令ans = 1, pow = 3;
第一次n = 1010(2), 1010(2)&1 = 0; 所以ans不变,即ans = 1 然后pow *= pow, 即pow = 9, n /= 2, 即n = 101(2);
第二次n = 101(2), 101(2)&1 = 1; 所以ans *= pow;即ans = 9, 然后pow *= pow, 即pow = 81, n/= 2,即n = 10(2);
第三次n = 10(2), 10(2) &1 = 0; ans不变, ans = 9, 然后pow *= pow, 即pow = 81*81, n/=2, 即n = 1;
第四次n = 1(2), 1(2)&1 = 1, ans*= pow, 即ans = 9 * 81*81,pow *= pow, 即pow = 81^4, n/= 2, 即n = 0;
n = 0, 所以算法结束;
#include <stdio.h> __int64 Qfact(int x, int n) { __int64 ret = 1, pow = x; while(n) { if(n&1) ret *= pow; pow *= pow; n /= 2; } return ret; } int main() { int x, n; while(~scanf("%d%d", &x, &n)) { printf("%I64d\n", Qfact(x, n)); } return 0; }