题目地址:点击打开链接
思路:第一个是运用了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的结果相同