HDOJ 1013 Digital Roots 解题报告
昨天写了这题,一开始以为非常简单,
结果直接用整型变量来写,写完还以为轻松AC,
结果去WA了,
后来才发现,这题的positive integer,可能是很大的数,
所以用字符数组来存了,,
现在唯一没有搞明白的就是,,,,
为什么可以一位一位往后移来做。
后来好像明白了,是我题目意思还是没有完全弄清楚
题意:
给你一个数,让你把他的各个位相加,直到把得到一个个位数为止。比方说9542这个数,9+5+4+2 = 20,20还不是一个个位数,那么2+0 = 2是个个位数,则输出2
所以可以用前面的两位两位一直往后面推,推到最后一位就OK了。
所以用数组存放没有任何问题。
刚开始写的WA代码,,直接当成数来做,完全没有考虑大数
还有必须吐槽一下的是VC++6.0实在是太旧了,没有完全支持C99标准,,
long long int 居然不能用,,,悲剧,还要开DEV来写。。
#include<stdio.h> int main() { long long int i,j; long long int m,n,t,k; while(scanf("%lld",&t)!=EOF && t!=0) { while(1) { m=t/10; n=t%10; k=m+n; if(k<10) break; t=k; } printf("%lld\n",k); } return 0; }
后来写的AC的代码
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[1013]; //用数组存放大数,模拟大数相加的情况来写代码 6 int temp; 7 int i, len; 8 while(scanf("%s", &a)!=EOF && a[0]!='0') 9 { 10 len=strlen(a); 11 for(i=0; i<len-1 ; i++) 12 { 13 while(1) 14 { 15 temp=a[i]-'0'+a[i+1]-'0'; 16 while(temp>=10) 17 { 18 temp=temp/10+temp%10; 19 } 20 a[i+1]=temp+'0'; 21 break; 22 } 23 } 24 printf("%c\n", a[len-1]); //将要输出的值存放在最后一个字符,然后输出字符 25 } 26 return 0; 27 }
另外一个AC的代码(最后用的数整型变量sum来输出)
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[1013]; 6 int temp, sum; 7 int i, len; 8 while(scanf("%s", &a)!=EOF && a[0]!='0') 9 { 10 len=strlen(a); 11 for(i=0,temp=0,sum=0; i<len;i++) 12 { 13 sum+=a[i]-'0'; 14 temp=sum; 15 while(sum/10) 16 { 17 sum=0; 18 while(temp/10) 19 { 20 sum+=temp%10; 21 temp/=10; 22 } 23 sum+=temp; 24 temp=sum; 25 } 26 } 27 printf("%d\n", sum); 28 } 29 return 0; 30 }
还有一位大神写的代码
如此简洁,,,
1 #include<stdio.h> 2 int main() 3 { 4 int a,c; 5 for(;scanf("%1d",&a),a>0;printf("%d\n",--a%9u+1)) 6 while((c=getchar())-48u<10) 7 a+=c-48; 8 return 0; 9 }
仅仅用了9行 。。。。
1.一位数模9是它本身(9除外);整十数模9是它十位的数字(90除外);整百数摸9是它百位的数字(900除外)...... 2.对于一个一般的数,可以分拆成几个10的幂的和;一般的数模9的结果,实质就是题目所描述的"数字根"(9的倍数除外). 3.反复提到9的倍数除外,那这个除外的结果是什么?想一下就清楚.所以楼主先--a再%9最后+1就是在处理这种情况 4.数字后面跟u后缀代表无符号整数,至于9啊48啊还要加这个,那是楼主在炫耀他的代码能力,大家可无视之 5.最后提醒 48 == ‘0’