zoukankan      html  css  js  c++  java
  • 第二次作业———“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。
    • 注意数组过大必须放于全局变量,这个点在本地编译运行的时候程序一运行就崩溃,看了好久代码没发现问题,最后才想到是数组过大。(这个要点已经多次错误,定引起重视)。
  • 相关阅读:
    LTPA Cookie原理
    如何对更改internet密码所需的缓存时间进行调整?
    Freemem eclipse查看内存的小插件
    Java中static、final用法小结
    MANIFEST.MF内容属性名详细解释
    Java程序员的良药:应用程序的开发技巧
    spring struts2 ibatis框架整合开发
    java中静态代码块的用法 static用法详解 类的加载顺序
    从svn上直接导入项目到workspace中
    Eclipse自动生成UML图 Green UML和ModelGoon(直接推拽)
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/5166290.html
Copyright © 2011-2022 走看看