九余数定理

Posted theshorekind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了九余数定理相关的知识,希望对你有一定的参考价值。

九余数定理概念:

首先看九余数,即一个数对9取余的得到的数(某数%9)称为九余数。

一个数的各个位数之和小于10的数称为这个数的九余数,(相加至小于10)。

可以这么说一个数各个位数相加如果相加之后的结果小于10,那么这个结果就等于这个数模9(对9取余)。

举个例子:比如215,各个位数相加值小于10:2+1+5=8<10,215%9=8,两者相等。

还有一个应用:

比如num=1000*a+100*b+10*c+d;

可以写成num=999*a+99*b+9*c+(a+b+c+d);

这样就意味着,如果(a+b+c+d)能够整除9,那么num也能够整除9。

 

例题:

1.hdu1013 Digital Roots  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1013

直接应用定理,因为数比较大,只能用字符数组存储,然后让各个位相加%9即可。

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int main()
 6 {
 7     char a[10000];
 8     while(scanf("%s",&a)!=EOF)
 9     {
10         getchar();
11         if(a[0]==0)
12         break;
13         int num=0;
14         int len=strlen(a);
15         for(int i=0;i<len;i++)
16         {
17             num+=a[i]-0;
18         }
19         num=num%9;
20         if(num==0)
21         printf("9
");
22         else
23         {
24             printf("%d
",num);
25         }
26     }
27     return 0;
28 }

 

2.hdu1163 Eddy‘s digital Roots 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1163

直接应用定理,各个数位的和等于这个数%9,比如44=(4*4%9)*4%9*4%9;

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int main()
 5 {
 6     int n;
 7     while(scanf("%d",&n),n)
 8     {
 9         int num=n;
10         for(int i=1;i<n;i++)
11         {
12             num=n*num%9;
13         }
14         if(num==0)
15         printf("9
");
16         else
17         printf("%d
",num);
18     }
19     return 0;
20 }

 

以上是关于九余数定理的主要内容,如果未能解决你的问题,请参考以下文章

HDU1013,1163 ,2035九余数定理 快速幂取模

HDU 1013 Digital Roots(九余数定理)

HDU 1013 Digital Roots(字符串,大数,九余数定理)

初识中国余数定理 (Chinese Remainder Theorem)

HDU1163 - Eddy's digital Roots

定理总结