HDU 1013 Digital Roots(求数根,九余数定理)

来源:互联网 发布:listmap转json 编辑:程序博客网 时间:2024/06/05 23:47

题目地址:点击打开链接

思路:第一个是运用了9余数定理,看下面详解,第二个是模拟

AC代码:

#include<iostream>#include<cstdio>using namespace std;int main(){int sum;char c;while(1)    {        sum = 0;        //while(cin>>c && c != '\n')不能用cin输入输出        while(scanf("%c",&c) && c != '\n')        {            sum += c - '0';        }        if(sum == 0)            break;        if(sum % 9 == 0)            sum = 9;        else            sum = sum % 9;        cout<<sum<<endl;    }return 0;}


#include<iostream>using namespace std;int main(){int sum,i,x;string s;while(cin>>s){if(s.compare("0")==0)break;sum = 0;for(i=0; i<s.length(); i++){sum += s[i] - '0';}while(sum/10){x = sum;sum = 0;while(x){sum += x % 10;x /= 10;}}cout<<sum<<endl;}return 0;}

九余数定理

一个数对九取余后的结果称为九余数。

一个数的各位数字之和相加后得到的<10的数字称为这个数的九余数(如果相加结果大于9,则继续各位相加)

这个还是挺好理解的,前提是要理解模运算的规则,在这里简单敲一下

(a+b)%p = (a%p+b%p)%p;

(a-b)%p = (a%p-b%p)%p;

(a*b)%p = (a%p*b%p)%p;

(a^b)%p = ((a%p)^b)%p;

随便举一个例子,本来1000%9=(1%9*1000%9)%9,这里我每次只写括号里面的,外面统一加一个%9,运算结果不变

1234%9=(1%9*1000%9+2%9*100%9+3%9*10%9+4%9)%9=(1+2+3+4)%9;

出现这种状况的原因的是10的倍数对9取余为1,例如1000=9*111+1 , 100=9*11+1 , 10=9*1+1;

简单的说就是:一个整数模9的结果与这个整数的各位数字之和模9的结果相同

0 0
原创粉丝点击