0
点赞
收藏
分享

微信扫一扫

poj-1519


//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)

举报

相关推荐

ural 1519

poj 2472

北大POJ

POJ 2503

poj 1691

POJ 3123

POJ 1611

0 条评论