第二次作业———“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\n", arr);
    } else
        printf("%s\n", 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\n", ans);
    } else
        printf("%s\n", ans);
    return 0;
}

评测结果

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

if(temp == 0)
    printf("0");
else if(temp < 0) {
    printf("-");
    printf("%s\n", ans);
} else
    printf("%s\n", 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\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;
}

评测结果

总结

  • 看到题目多思考,不急于敲,多加思索可能会想到更简便的方法。
  • 考虑问题要周全,避免出现不必要的bug。
  • 注意数组过大必须放于全局变量,这个点在本地编译运行的时候程序一运行就崩溃,看了好久代码没发现问题,最后才想到是数组过大。(这个要点已经多次错误,定引起重视)。
posted @   zxzhang  阅读(333)  评论(2编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航