//132K 0MS C++
#include <cstdio>
#include <cstring>
using namespace std;
long long getDigitSum(long long val) {
long long digitSum = 0;
if (val < 10) {
return val;
} else {
while(val) {
digitSum += val%10;
val /= 10;
}
}
return digitSum;
}
void solve(long long val) {
while(val > 9) {
val = getDigitSum(val);
}
printf("%lld\n", val);
}
char num[100];
int main() {
// long long num;
while(scanf("%s", num) != EOF) {
if (num[0] == '0') {
return 0;
}
long long sum = 0;
for (int i = 0; i < strlen(num); i++) {
sum += num[i] - '0';
}
solve(sum);
}
}
水题, 就是要注意,最后的输入会非常大,long long, double都hold不住,直接用字符串存一下,然后预处理把每个位加一下就可以了.
其实这道题数据弱(如果输入很多,又对时间很要求的话,上面的code应该会TLE的),因为还是更为快捷的办法:
http://blog.sina.com.cn/s/blog_676070110100jw7q.html
一个数的数字根和该数mod 9 是关于9同余的。(其实这个题还是挺有意思的)
数字根:如果把一个大数的各位数字相加得到一个和,再把这个和的各位数字相加又得一个和,再继续作数字和,直到最后的数字和是个位数为止,
这最后的数称为最初那个数的“数字根”。这个数字根等于原数除以9的余数(直接对9取余),因此这个计算过程常常称为“合九法”。
“其实把一个大数加起来得到一个和;再把这个和的各位数字加起来得到一个和;这样下去,直到最后一得数为止。最合适这个数成为最初那个数的“数字根”。
这个数字根等于原数除以9的余数(直接对9取余)。这个计算过程,常常称为“弃九法”。
求数字根,最快的方法是原数的数字时把9舍去。列如385916的数字根,其中有9,而3+6,8+1都是9,就可以舍去,最后剩下5,就是数字根。”
证明如下:
设自然数N=a[n]a[n-1]…a[0],其中a[0],a[1]、…、a[n]分别是个位、十位、…上的数字,再设M=a[0]+a[1]+…+a[n],求证:N≡M(mod9).
证明:
∵ N=a[n]a[n-1]…a[0]=a[n]*10^n+a[n-1]*10^(n-1)+…+a[1]*10+a[0].
又∵ 1≡1(mod 9),
10≡1(mod 9),
102≡1(mod 9),
…
10n≡1(mod 9).
上面这些同余式两边分别同乘以a[0]、a[1]、a[2]、…、a[n],再相加得:
a[0]+a[1]*10+…+a[n]*10^n≡(a[0]+a[1]+…+a[n])(mod 9),
即 N≡M(mod 9)
标签:10,数字,val,long,num,poj,1519,mod
From: https://blog.51cto.com/u_9420214/6333338