题目大意
题目原文:http://uva.onlinejudge.org/external/100/10035.pdf
输入两个数,输出两个数相加需要进位的次数。
由于题目要求10位,而且一行内接收两个数,那么我使用了scanf("%s%s",a,b),用a,b两个字符串变量来接收。
然后用两个指针(x,y)来指向计算位的位置,用一个变量bo来记录是否有进位。每次判断一次该位相加之和是否大于10,大于10说明有进位,计数变量加一。并x--;y--;但是用变量做的时候会出现x,y指针指向a[0]和b[0]之后再x--超出字符串数组的范围的情况。(可能只有一个超出)针对这种情况,判断x==a时,a[0]='0';但不x--;这样就可以处理好这种情况了。
程序计算结束的标志是x==a&&y==b;但出现这种情况的时候不能马上退出循环,要再做一次加法运算才行。
最后程序输出的时候要注意如果是No,1的时候operation是没有s的,大于2的时候operation要加s。
附上代码:
View Code
1 #include<stdio.h> 2 int main() 3 { 4 char a[11],b[11],*x,*y; 5 int i,bo,z,n,br; 6 while(1) 7 { 8 scanf("%s%s",a,b); 9 if(*a=='0'&&*b=='0') break; 10 for(i=0;i<11;i++) if(a[i]==0) {x=&a[i-1];break;}//取指针x指向'\0'之前一个元素 11 for(i=0;i<11;i++) if(b[i]==0) {y=&b[i-1];break;}//同上 12 bo=n=br=0; 13 while(1) 14 { 15 if(*x+*y-2*'0'+bo>=10) {bo=1;n++;}//有进位 16 else bo=0; 17 if(x==a) a[0]='0'; 18 else x--; 19 if(y==b) b[0]='0'; 20 else y--; 21 if(br==1) break; 22 if(x==a&&y==b) br=1;//标记下次循环完要退出循环 23 } 24 if(n==1) printf("1 carry operation.\n"); 25 else if(n==0) printf("No carry operation.\n"); 26 else printf("%d carry operations.\n",n); 27 } 28 return 0; 29 }