UVA - 11029 Leading and Trailing

题目大意:给出一个n和k求n^k的前三位数和后三位数。


解题思路:后三为数可以用分治的方法(快速幂)去做,可是前三位数就比较麻烦了,看了别人的题解.

n^k = 10 ^ (k * log10(n)),所以可以将多余的位数移到小数点后面然后舍弃掉,只保留前三位,pow(10, 2 + fmod(k * log10(n), 1)).

#include<cstdio>
#include<cmath>

int pow_mod(int m, int n) {
    if(n == 1)
		return m % 1000;
    int s = pow_mod(m, n / 2);
    if(n % 2 == 0)
		return s * s % 1000;
    return s * s * (m % 1000) % 1000;
}

int main() {
    int T, a, b;
    scanf("%d", &T);
	while (T--) {
        scanf("%d%d", &a, &b);
        int last = pow_mod(a, b);
        int head = (int)pow(10, 2 + fmod(b * log10(a), 1));
        printf("%d...%03d\n", head, last);
    }
    return 0;
}


你可能感兴趣的:(UVA - 11029 Leading and Trailing)