[PAT解题报告] A+B Format

题目比较简单,求a + b的和。
对于这种问题,需要注意 (1) 有几组数据, (2) 数据范围有多大。
好在题目都有清晰的描述。我们知道只有一组数据,数据范围是-106到10 6 这说明答案不会超过int范围。输出要注意就是输出的格式要按照三位一节的形式输出。比如1000, 要输出1,000。
我们有大概有两种方法对待这种问题:
(1) 把答案存入字符串,再输出 ,很方便。 c语言有sprintf可以直接把答案写入字符串再3位3位输出即可,注意3位是从低位算的,所以要把高位的n % 3位先输出了(n是总位数,如果有余数显然要先输出来),还要注意什么时候有逗号,只有之前输出过数字才有逗号,总之是一些细节的处理。
代码如下:
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
char s[100];
int main() {
int a,b;
    scanf("%d%d",&a,&b);
    a += b;
    if (a < 0) {
        putchar('-');
        a = -a;
    }
    sprintf(s,"%d",a);
    int n = strlen(s), m = n % 3,i = 0;
    for (; i < m; ++i) {
        putchar(s[i]);
    }
    for (; i < n; i += 3) {
        if (i) {
            putchar(',');
        }
        printf("%c%c%c",s[i],s[i + 1],s[i + 2]);
    }
    puts("");
    return 0;
}

    

(2)截取答案的每一位数字放入数组(或者STL vector),当然我们可以直接3位3位地截取,相当于把原来的数当作“1000进制”的数来对待。最后输出时可以采用printf("%03d")的方式,它可以用0自动补齐3位,同时还要注意最高位要先输出来。同时还要注意0这种特殊情况可以特殊判断。
代码如下:
#include <cstdio> 
#include <cstring> 
#include <string> 
#include <vector> 

using namespace std; 
int main() {
int a,b;
    scanf("%d%d",&a,&b);
    a += b;
    if (a == 0) {
        puts("0");
    }
    else {
        if (a < 0) {
            putchar('-');
            a = -a;
        }
    
        vector<int> answer;
        for (; a; a /= 1000) {
            answer.push_back(a % 1000);
        }
        printf("%d", answer.back());
        for (int i = answer.size() - 2; i >= 0; --i) {
            printf(",%03d", answer[i]);
        }
        puts("");
    }
    return 0;
}

最后提一些做OJ的心得:
(1) 采用C的输入输出,因为它们比较快
(2) 可以把数组、字符串开得大一些,而且最好开成全局 (比如解法一中的s[100],其实开到s[10]就可以了)
(3) vector与数组哪个方便用哪个——以实用为目的
(4) 注意严格的输入输出格式。

题目链接: http://www.patest.cn/contests/pat-a-practise/1001

全部评论
#include <bits/stdc++.h> using namespace std; typedef long long LL; int main() {     int a,b;     scanf("%d%d",&a,&b);     bool t=false;     int ans = a+b;     if(ans<0)         t=true;         ans = abs(ans);     stringstream str;     str<<ans;     string s = str.str();     int len = s.length();     reverse(s.begin(),s.end());     int counts = 0;     string _ws;     for(int i=0;i<len;i++)     {         _ws.push_back(s[i]);         counts++;         if(counts==3&&i!=len-1)         {             counts = 0;             _ws.push_back(',');         }     }     if(t) _ws.push_back('-');     reverse(_ws.begin(),_ws.end());     cout<<_ws<<endl; }
点赞 回复 分享
发布于 2017-10-15 13:37

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
面试官_我太想进步了:混学生会的,难怪简历这么水
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务