第二次作业———“A+B Format”思路与总结

时间:2023-03-10 08:12:45
第二次作业———“A+B Format”思路与总结

GitHub链接: https://github.com/zzy19961112/object-oriented

"A+B Format"

题目第二次作业———“A+B Format”思路与总结

解题思路:

一开始粗略看这道题,熟悉的A+B题目,读完之后就发现略有不同,输出结果的格式要求跟平常所用的计算器的输出格式一样:每三位用一个逗号隔开。此时出来的解题思路便是把每一位的数字存进数组,每隔三位存进一个逗号最后输出。

代码:

#include<stdio.h>
#include<string.h>
int main()
{
  int a,b,temp,sum,i=0;
  char arr[2000005];
  scanf("%d%d",&a,&b);
  sum=a+b;
  temp=sum;
  sum=(sum>0)?sum:-sum;
  while(sum){
    if(i==3||i==7){
      arr[i]=',';
      arr[++i]=sum%10+48;
    }
    else
       arr[i]=sum%10+48;
    sum/=10;
    i++;
  }
  strrev(arr);
  if(temp<0) {
    printf("-");
    printf("%s\n",arr);
  }
  else
      printf("%s\n",arr);
  return 0;
}

评测结果

第二次作业———“A+B Format”思路与总结

编译错误,一开始感觉很奇怪,在本地编译器都能通过,在线测评却连编译都通过不了,看了下错误信息,在23行提示warning,好像是不支持“strrve”函数,所以第二次尝试就用暴力实现数组的反转。

代码:

#include<stdio.h>
#include<string.h>
char arr[2000005],ans[2000005];
int main()
{
  int a,b,temp,sum,length,j,i=0;
  scanf("%d%d",&a,&b);
  sum=a+b;
  temp=sum;
  sum=(sum>0)?sum:-sum;
  while(sum){
    if(i==3||i==7){
      arr[i]=',';
      arr[++i]=sum%10+48;
    }
    else
       arr[i]=sum%10+48;
    sum/=10;
    i++;
  }
  length=strlen(arr);
  for(i=0,j=length-1;i<length;i++,j--){
     ans[i]=arr[j];
  }
  if(temp<0) {
    printf("-");
    printf("%s\n",ans);
  }
  else
      printf("%s\n",ans);
  return 0;
}

评测结果

第二次作业———“A+B Format”思路与总结

这次编译通过却错误了一个点,回看代码查找错误,在while判断中没有考虑到和为'0'的情况。所以在输出部分更改代码

if(temp==0)
printf("0");
else if(temp<0){
printf("-");
printf("%s\n",ans);
}
else
printf("%s\n",ans);

评测结果

第二次作业———“A+B Format”思路与总结

成功通过。
但是写这篇博的时候,我突然觉得这种方法好像很麻烦,还动用了数组,理论上在线测评第一题应该不用这么麻烦的,于是我又测试了另一种方法:通过数字的位数来分情况。

代码

#include<stdio.h>
int main()
{
    int a,b,sum;
    scanf("%d%d",&a,&b);
    sum=a+b;
    if(sum<0){
        printf("-");
        sum=-sum;
    }
    if(sum>=1000000){
        printf("%d,%03d,%03d\n",sum/1000000, (sum/1000)%1000, sum%1000);
    }
    else if(sum >= 1000){
        printf("%d,%03d\n",sum/1000,sum%1000);
    }
    else
        printf("%d\n", sum);
    return 0;
}

评测结果

第二次作业———“A+B Format”思路与总结

总结

1.看到题目多思考,不急于敲,多加思索可能会想到更简便的方法。
2.考虑问题要周全,避免出现不必要的bug。
3.注意数组过大必须放于全局变量,这个点在本地编译运行的时候程序一运行就崩溃,看了好久代码没发现问题,最后才想到是数组过大。(这个要点已经多次错误,定引起重视)。