[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