先附上網址 https://zerojudge.tw/ShowProblem?problemid=e295
題目簡單來說就是非常快的輸出 a+b
有種東西叫 getchar_unlocked 和 putchar_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);
}
|
結束

Author
93wilsonlu
LastMod
2020-07-29
License
原創文章,如需轉載請註明文章作者和出處。謝謝!