九余数定理概念:
首先看九余数,即一个数对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 }