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

作业链接
GitHub链接

题目

解题思路

一开始粗略看这道题,熟悉的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
", arr);
    } else
        printf("%s
", arr);
    return 0;
}

评测结果

编译错误,一开始感觉很奇怪,在本地编译器都能通过,在线测评却连编译都通过不了,看了下错误信息,在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
", ans);
    } else
        printf("%s
", ans);
    return 0;
}

评测结果

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

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

评测结果

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

#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
", sum / 1000000, (sum / 1000) % 1000, sum % 1000);
    } else if(sum >= 1000) {
        printf("%d,%03d
", sum / 1000, sum % 1000);
    } else
        printf("%d
", sum);
    return 0;
}

评测结果

总结

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