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

题目地址:点击打开链接

思路:第一个是运用了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的结果相同

你可能感兴趣的:(HDU 1013 Digital Roots(求数根,九余数定理))