HDU 1013 Digital Roots(求数根,九余数定理)
原创
©著作权归作者所有:来自51CTO博客作者mb62ea10deefd92的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目地址:点击打开链接
思路:第一个是运用了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的结果相同