10035 Primary Arithmetic

题目大意

题目原文: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 }
原文地址:https://www.cnblogs.com/syiml/p/2910196.html