这道题目就是个位数相加,然后再一次相加,直到只剩下一位数。
考虑打表:
10 = 1
11 = 2
12 = 3
13 = 4
14 = 5
15 = 6
16 = 7
17 = 8
18 = 9
19 = 10 = 1
20 = 2
21 = 3
……
99 = 18 = 9
100 = 1
从规律可以看出,其实是有为9的循环节,也就是直接mod 9 就可以得到结论。如果mod 9 得到0 的话,应该打印出9.
证明:
如果是一位数A,答案就是A,也可以写成A mod 9;( 若A mod 9 == 0,打印出9)
如果是两位数(A * 10 + B ) mod 9 = (A mod 9 ) * ( 10 mod 9 ) + (B mod 9) mod 9;
拓展:
我记得有一个判断能否被3整除的方法是将所有位数相加起来,能被3整除的话就能,不能就不能,其实是同样的道理的。
也就是说每一个值都有一个“贡献”,因为A *10 = (A % 3) * (10 % 3) = A % 3,所以说A的贡献是不论它在哪个位置,都是A %3;
如果是N^N的话,属于N个N相乘,那么可以求出每一个N的贡献:
(N * N * N * N * N * N * N ) = (N % 9) * ( N % 9)……用快速幂求得。
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long _int64;
//计算幂取模,a^b mod n,O(logb)
int modular_exponent(int a,int b,int n)
{
int ret=1;
for(;b;b>>=1,a=(int)((_int64)a)*a%n)
if(b&1) ret=(int)((_int64)ret)*a%n;
return ret;
}
int main() {
int n;
while(scanf("%d", &n), n) {
int tmp = modular_exponent(n, n, 9);
if(tmp == 0) printf("9\n");
else printf("%d\n", tmp);
}
return 0;
}