1013—Digital Roots

来源:互联网 发布:centos gcc rpm安装包 编辑:程序博客网 时间:2024/06/06 00:10

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1013

 

收获:一个数的各个位数之和除以9的余数等于这个数除以9的余数。

原因:从各个数位来分析:个位上的数的大小没有发生变化;十位数将10看成了1、看少了1个9,20看成了2、看少了2个9,…;百位上将100看成了1、看少了11个9,200看成了2、看少了22个9,…;……这些少看的若干个9除以9之后得到的余数都是0,根据同余原理,起决定性作用的是所有数字之和除以9之后的余数,所以,一个数的各个位数相加的和除以9的余数与这个数除以9的余数相等。。(摘抄别人的理解)

e.g相等把那个数看成ab,则各个位数相加的和除以9就是(a+b)÷9 ,这个数除以9就是(10a+b)÷9所以下面的比上面的多了9a,9a就是9的倍数

 

第二个代码比较好理解~~

我的代码1:

#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){char uu[1005];int i;int a;while(gets(uu)&&uu[0]!='0'){a=0;int i;for(i=0;i<strlen(uu);i++)a+=uu[i]-'0';a=a%9;if(a==0)a=9;printf("%d\n",a);}return 0;}


 

上面代码中:如果a+=uu[i]-'0'改为a=a*10+uu[i]-'0',则还应该{a=a*10+uu[i]-'0';a=a%9;}如果不加“{}”,则由于a的范围题目没给,可能很大,int是满足不了的~~


我的代码2:

#include<stdio.h>#include<string.h>#include<stdlib.h>int ro(int n){int sum=0,i;for(i=n;i>0;i=i/10)sum+=i%10;return sum;}int main(){char uu[1005];while(gets(uu)&&uu[0]!='0'){int i,sm=0;for(i=0;i<strlen(uu);i++)sm+=uu[i]-'0';while(1){sm=ro(sm);if(sm<=9)break;}printf("%d\n",sm);}return 0;}


 

 

原创粉丝点击