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的结果相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值