#includeint quickpow(int x, int y) { int a = 1; while (y) { if (y & 1) a *= x; x *= x; y >>= 1; } return a; } int main() { int n, i = 1, f, q; scanf("%d", &n); f = quickpow(10, n - 1); //因为我们要找n位数的值所以现设f从n-1位数开始 i = f; //用i记录 while (i < f * 10) { q = i; //用q记录i int sum = 0; //用sum记录各位数n次方之和 do { int p; p = q % 10; //用p记录各位数 q /= 10; //每一次我们把q丢掉后面的一位 sum += quickpow(p, n); //quickpow效果等同于pow不用管 } while (q > 0); //我们每次丢的过程中q都在少一位最后变为0,这就是我们跳出循环条件 if (sum == i) printf("%dn", sum); i++; //遍历10的n-1次方到10的n次方之间的数 } return 0; }
quickpow为快速幂过程
主要过程是把指数二进制



