先附上網址 https://zerojudge.tw/ShowProblem?problemid=e295

題目簡單來說就是非常快的輸出 a+b

有種東西叫 getchar_unlockedputchar_unlocked,雖然不太安全,但速度比 scanf 快很多

詳細介紹可以看這裡: https://www.geeksforgeeks.org/getchar_unlocked-faster-input-cc-competitive-programming/

所以我們可以輕輕鬆鬆地寫出這段代碼

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
using namespace std;

int main() {
  char c;
  unsigned a = 0, b = 0, sum;
  bool flag = 1; // 表示現在正在輸入 a 還是 b
  while ((c = getchar_unlocked()) != EOF) {
    if (c == ' ') {
      flag = 0;
    } else if (c == '\n') {
      sum = a + b;
      while (sum) {
        putchar_unlocked((sum % 10) + '0');
        sum /= 10;
      }
      putchar_unlocked('\n');
      a = b = 0;
      flag = 1;
    } else {
      if (flag) {
        a = a * 10 + c - '0';
      } else {
        b = b * 10 + c - '0';
      }
    }
  }
}

這時你會發現一件神奇的事,原本輸出 15 變成 51

所以要把數字 reverse 一下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
result = 0;
sum = a + b;
while (sum) {
  result = result * 10 + (sum % 10);
  sum /= 10;
}
while (result) {
  putchar_unlocked((result % 10) + '0');
  result /= 10;
}
putchar_unlocked('\n');

這時可以把代碼送出去了!

诶?這啥?

原來最後一筆測資不會讀到換行符號,直接 EOF

順便把輸出包成 function

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
using namespace std;

void print_sum(unsigned sum){
  unsigned result = 0;
  while (sum) {
    result = result * 10 + sum % 10;
    sum /= 10;
  }
  while (result) {
    putchar_unlocked((result % 10) + '0');
    result /= 10;
  }
  putchar_unlocked('\n');
}

int main() {
  char c;
  unsigned a = 0, b = 0;
  bool flag = 1;
  while ((c = getchar_unlocked()) != EOF) {
    if (c == ' ') {
      flag = 0;
    } else if (c == '\n') {
      print_sum(a + b);
      a = b = 0;
      flag = 1;
    } else {
      if (flag) {
        a = a * 10 + c - '0';
      } else {
        b = b * 10 + c - '0';
      }
    }
  }
  print_sum(a + b);
}

結束