zoukankan      html  css  js  c++  java
  • PAT 1001 A+B Format (20 point(s))

    题目:

    我一开始的思路是:

    1. 用math.h中的log10函数来计算位数(不建议这么做,因为会很慢,而且会出一点别的问题);
    2. pow函数根据要插入分号的位置来拆分a+b成一个个数字(例如res / pow(10, len - 3)来获得千位以前的数字),从左往右依次输出,同时在对应位置输出,

    也就是说,我这里的思路是直接用数字来进行处理的,但是这样做其实非常低效而且很容易写错代码,因此我看了下柳婼的代码,换成了这个思路:先将计算结果转换为字符串后进行处理。这样就会简单许多:

    #include <iostream>
    
    int main(){
        int a, b;
        std::cin >> a >> b;
        std::string stringNum = std::to_string(a + b);
        int len = stringNum.length();
        for(int i=0; i<len; i++){
            std::cout << stringNum[i];
            if(stringNum[i] == '-'){
                continue;
            };
            if((i + 1)%3 == len%3 && i != len-1){
                std::cout << ",";
            }
        }
        return 0;
    }
    

    我一开始的时候搞不明白为什么判定条件有(i + 1)%3 == len%3,后来想了想,整理成了以下思路:

    首先,我们假设计算结果为7位,那么可以知道,len = 7,且len%3结果为1。画成图:

    因为我们的下标是从左往右进行计数的,而且从0开始计数,所以需要先通过i+1来变成和计算长度时一样的从1开始计数。

    然后,我们先想想看应该怎么输出,如果是从右往左输出的话,那么我们先输出3位,然后输出,,然后再输出3位,再输出一次,,最后因为剩下的字符只有一个,所以输出了这个字符之后就不需要再输出逗号了。

    但是计算机输出字符只能够从左往右输出,所以我们先计算出输出完所有的“逗号”之后,最后剩下的字符的数目,所以需要len%3。我们接下来要做的事情就是先输出这几个最后会剩下的字符,然后输出逗号,然后继续往后走3位,每次走完3位就输出一次逗号,直到最终遍历完整个字符串。

    因此我们可以明白,其实设置(i + 1)%3 == len%3的目的就是:

    1. 让程序先输出必然会剩下的几个字符
    2. 然后每隔3位让程序输出一次逗号

    所以,其实(i + 1)%3 == len%3就是相当于偏置项,让程序能够通过“偏置”来先输出最头几个肯定剩下来的字符。但是这样比较不容易理解,所以我们可以改写成这样:(i + 1)%3 - (len%3)== 0,因为(i+1) % 3必然取0, 1, 2这3个值中的一个,所以如果减去len%3,那么可以确保前len%3个字符输出期间不会输出逗号,且不会干扰到后面的计数。

    为了方便理解,在修改代码之后可以变成:

    #include <iostream>
    
    int main(){
        int a, b;
        std::cin >> a >> b;
        std::string stringNum = std::to_string(a + b);
        int len = stringNum.length();
        for(int i=0; i<len; i++){
            std::cout << stringNum[i];
            if(stringNum[i] == '-'){
                continue;
            };
            if((i + 1)%3 - len%3 == 0 && i != len-1){
                std::cout << ",";
            }
        }
        return 0;
    }
    

    而且提交之后可以看到,是可以通过的:

    本博客文章默认使用CC BY-SA 3.0协议。
  • 相关阅读:
    文本查询程序再探
    第15章 面向对象程序设计
    错误和异常处理 使用模板
    PHP会话管理
    身份验证
    表单提交与接收 文件提交与接收
    PHP文件访问
    PHP面向对象
    PHP速学
    第14章 重载运算与类型转换
  • 原文地址:https://www.cnblogs.com/yejianying/p/pat_advanced_1001.html
Copyright © 2011-2022 走看看