PAT题目分析

PAT A1001 A+B Format (20)

2019-03-17  本文已影响0人  ranerr_

PAT A1001 A+B Format 原题链接
PAT甲级题目目录(简书)
PAT甲级题目目录(CSDN)
在CSDN上查看本文
Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).
Input Specification:
Each input file contains one test case. Each case contains a pair of integers a and b where −10​6​​≤a,b≤10​6​​. The numbers are separated by a space.
Output Specification:
For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.
Sample Input:

-1000000 9

Sample Output:

-999,991

一次代码:
思路: 将数值输出为字符串然后从后往前加上逗号,最后打印结果
分析:

  1. 遇到数字显示类需要按位处理的程序时使用sprintf (#include <cstring>)转换成字符数组
  2. 为了防止符号被当成数字计算位数,符号需要单独处理
  3. 在需要判断正负号输出时注意0的符号
  4. 在进行操作时注意下标与操作的对应关系:这里是显示','还是数字的区别
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int main() {
  int a, b, sum;
  bool ispositive;
  char s_sum[100];
  scanf("%d%d", &a, &b);
  sum = a + b;
  if (sum >= 0)
    ispositive = true;
  else
    ispositive = false;
  sum = abs(sum);
  sprintf(s_sum, "%d", sum);

  int len = int(strlen(s_sum));
  int comma_tag = len;
  if (len > 3) {
    while (comma_tag > 0) {
      comma_tag -= 3;
      if (comma_tag > 0) {
        for (int i = len; i >= comma_tag; i--) {
          //因为要移动'\0'所以从len开始
          s_sum[i + 1] = s_sum[i];
        }
        s_sum[comma_tag] = ',';
      }
    }
  }

  if (ispositive) ;
  else
    printf("-");
  printf("%s", s_sum);
  return 0;
}

改进代码:
思路: 对于仅作输出用的字符串进行操作时,可以边计算边输出,而不用真的修改字符串
分析:

  1. 在输入输出数量不大,格式不复杂时可以考虑使用iostream
  2. 对于仅作输出用的字符串进行操作时,可以边计算边输出,而不用真的修改字符串
  3. 符号可以当做数字一起处理,只要在输出时判断','不要加在'-'和数字之间即可
  4. 由于逗号的位置是从后开始数的,但是按位输出时需要从前开始输出,需要求出正序下标和倒序下标之间的转化关系.如图,设"倒序下标"为j,每当输出完满足j\mod 3=0的位上的字符时输出一个逗号(不包括'-'和最后一位).观察得出j=(len-1-i)(len是字符串长度).
#include <iostream>
using namespace std;
int main() {
  int a, b;
  cin >> a >> b;
  string s = to_string(a + b);
  int len = s.length();
  for (int i = 0; i < len; i++) {
    cout << s[i];
    if (s[i] == '-')
      continue;
    if ((len - 1 - i) % 3 == 0 && i != len - 1)
      cout << ',';
  }
  return 0;
}

二次改进代码:
分析:

  1. 希望在不麻烦的情况下把continue那一句拿到循环外面做
  2. 想要把符号和数字分开处理,即需要计算伪下标i-1和倒序下标j的关系.如图,j=(len-2-(i-1))=(len-1-i)刚好和连同负号一起考虑时一样
#include <iostream>
#include <string>
using namespace std;
int main() {
  int a, b;
  cin >> a >> b;
  string s = to_string(a + b);
  int len = s.length();
  int i = 0;
  if (s[i] == '-') {
    cout << s[i];
    i++;
  }
  for (; i < len; i++) {
    cout << s[i];
    if ((len - 1 - i) % 3 == 0 && i != len - 1)
      cout << ',';
  }
  return 0;
}
上一篇下一篇

猜你喜欢

热点阅读