# 场景一:多组空格分隔的两个正整数
输入描述:
输入包括两个正整数 a, b (1 <= a, b <= 1000),输入数据包括多组
输出描述:
输出 a + b 的结果
数据范围:
数据组数 1 <= t <= 100
输入示例:
1 5
10 20
输出示例:
6
30
代码实现:
#include <iostream> | |
using namespace std; | |
int main() { | |
int a = 0, b = 0; | |
while (cin >> a >> b) { | |
cout << a + b << endl; // 64 位输出请用 printf ("% lld") | |
} | |
return 0; | |
} |
# 场景二:第一行组数接空格分隔的两个正整数
输入描述:
输入第一行包括一个数据组数 t (1 <= t <= 100)
接下来每行包括两个正整数 a, b (1 <= a, b <= 1000)
输出描述:
输出 a + b 的结果
数据范围:
数据组数 1 <= t <= 100
输入示例:
2
1 5
10 20
输出示例:
6
30
代码实现:
#include <iostream> | |
using namespace std; | |
int main() { | |
int t = 0; | |
cin >> t; | |
int a = 0, b = 0; | |
for (int i = 0; i < t; ++i) { | |
cin >> a >> b; | |
cout << a + b << endl; | |
} | |
} |
# 场景三:空格分隔的两个正整数 以 0 0 结束
输入描述:
输入包括两个正整数 a, b (1 <= a, b <= 10^9),输入数据有多组,如果输入为 0 0 则结束输入
输出描述:
输出 a + b 的结果
数据范围:
数据组数 1 <= t <= 100
输入示例:
1 5
10 20
0 0
输出示例:
6
30
代码实现:
#include <iostream> | |
using namespace std; | |
int main() { | |
int a = 0, b = 0; | |
while (cin >> a >> b) { | |
if (a == 0 && b == 0) break; | |
cout << a + b << endl; | |
} | |
return 0; | |
} |
# 场景四:每行第一个为个数后带空格分割整数 以 0 结束
输入描述:
输入数据有多组,每行表示一组输入数据
每行的第一个整数为整数的个数 n (1 <= n <= 100)
接下来 n 个正整数,即需要求和的每个正整数
输出描述:
每组数据输出求和的结果
数据范围:
数据组数 1 <= t <= 100
每组数据中整数个数满足 1 <= n <= 100
每组数据中的值满足 1 <= val <= 100
输入示例:
4 1 2 3 4
5 1 2 3 4 5
输出示例:
10
15
代码实现:
#include <iostream> | |
using namespace std; | |
int main() { | |
int n = 0; | |
while (cin >> n) { | |
if (n == 0) break; | |
int sum = 0; | |
int num = 0; | |
for (int i = 0; i < n; ++i) { | |
cin >> num; | |
sum += num; | |
} | |
cout << sum << endl; | |
} | |
return 0; | |
} |
# 场景五:第一行组数接个数以及空格分隔的整数
输入描述:
输入的第一行包括一个正整数 t (1 <= t <= 100),表示数据组数
接下来 t 行,每行一组数据
每行的第一个整数为整数的个数 n (1 <= n <= 100)
接下来 n 个正整数,即需要求和的每个正整数
输出描述:
每组数据输出求和的结果
数据范围:
数据组数 1 <= t <= 100
每组数据中整数个数满足 1 <= n <= 100
每组数据中的值满足 1 <= val <= 100
输入示例:
2
4 1 2 3 4
5 1 2 3 4 5
输出示例:
10
15
代码实现:
#include <iostream> | |
using namespace std; | |
int main() { | |
int t = 0; | |
cin >> t; | |
for (int i = 0; i < t; ++i) { | |
int n = 0; | |
cin >> n; | |
int sum = 0; | |
int num = 0; | |
for (int j = 0; j < n; ++j) { | |
cin >> num; | |
sum += num; | |
} | |
cout << sum << endl; | |
} | |
return 0; | |
} |
# 场景六:多组未知数量的正整数
输入描述:
输入数据有多组,每行表示一组输入数据
每行不定有 n 个整数,空格隔开 (1 <= n <= 100)
输出描述:
每组数据输出求和的结果
输入示例:
1 2 3
4 5
0 0 0 0 0
输出示例:
6
9
0
代码实现:
// 借助 stringstream,把每行数据输入到一个 string ,再转换成一个流 | |
#include <iostream> | |
#include <string> | |
#include <sstream> | |
using namespace std; | |
int main() { | |
string str; | |
while (getline(cin, str)) { | |
stringstream ss(str); // 将字符串 str 拷贝至 stringstream 流 | |
int sum = 0; | |
int num = 0; | |
while (ss >> num) sum += num; // 等效于 while (getline (ss, t, ' ')) sum += stoi (t); | |
cout << sum << endl; | |
} | |
return 0; | |
} |
其中, getline (istream& is, string& str, char delim)
:(参考:std::getline )
- Extracts characters from
is
and stores them intostr
until the delimitation characterdelim
is found. - If the delimiter is found, it is extracted and discarded (i.e. it is not stored and the next input operation will begin after it).
- Note that any content in
str
before the call is replaced by the newly extracted sequence.
getline (istream& is, string& str)
:Extracts characters fromis
and stores them intostr
until the newline character,'\n'
, is found.
注意:如果在使用
getline()
函数之前已经使用过cin
,则需使用cin.get()
(或者,cin.ignore()
或getchar()
)读取缓冲区中的换行符\n
,然后再使用getline()
(参考:C++ 中 cin 和 getline 使用出错的解决方法 )
cin.get()
:可以读入包括空格,跳格,回车符在内的空白字符cin.ignore()
:丢弃输入的第一个字符。用来防止接收上次输入的回车符getchar()
:读取一个字符,包括回车,空格
或者:
// 每次 cin >> 时判断下一位是不是换行符,即 cin.get () == '\n' | |
#include <iostream> | |
using namespace std; | |
int main() { | |
int sum = 0; | |
int num = 0; | |
while (cin >> num) { | |
sum += num; | |
if (cin.get() == '\n') { | |
cout << sum << endl; | |
sum = 0; | |
} | |
} | |
return 0; | |
} |
# 场景七:一行多个空格分隔的字符串
输入描述:
输入有两行,第一行 n
第二行是 n 个字符串,字符串之间用空格隔开
输出描述:
输出一行排序后的字符串,空格隔开,无结尾空格
输入示例:
5
c d a bb e
输出示例:
a bb c d e
代码实现:
#include <iostream> | |
#include <string> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
int main() { | |
int n = 0; | |
cin >> n; | |
vector<string> words(n, ""); | |
for (int i = 0; i < n; ++i) { | |
cin >> words[i]; | |
} | |
sort(words.begin(), words.end()); | |
for (int i = 0; i < n - 1; ++i) { | |
cout << words[i] << " "; | |
} | |
cout << words[n - 1] << endl; // 无结尾空格 | |
return 0; | |
} |
# 场景八:多行空格分隔的字符串
输入描述:
多个测试用例,每个测试用例一行
每行通过空格隔开,有 n 个字符,n < 100
输出描述:
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开
输入示例:
a c bb
f dddd
nowcoder
输出示例:
a bb c
dddd f
nowcoder
代码实现:
// getline() | |
#include <iostream> | |
#include <vector> | |
#include <string> | |
#include <sstream> | |
#include <algorithm> | |
using namespace std; | |
int main() { | |
string str1, str2; | |
vector<string> words; | |
while (getline(cin, str1)) { | |
stringstream ss(str1); | |
while (getline(ss, str2, ' ')) words.push_back(str2); // 等效于 while (ss>> str2) words.push_back (str2); | |
sort(words.begin(), words.end()); | |
for (int i = 0; i < words.size() - 1; ++i) { | |
cout << words[i] << " "; | |
} | |
cout << words[words.size() - 1] << endl; | |
words.clear(); // 清空 words 数组 | |
} | |
return 0; | |
} |
或者:
// 判断换行符 cin.get () == '\n' | |
#include <iostream> | |
#include <vector> | |
#include <string> | |
#include <algorithm> | |
using namespace std; | |
int main() { | |
string word; | |
vector<string> words; | |
while (cin >> word) { | |
words.push_back(word); | |
if (cin.get() == '\n') { // 等效于 if (getchar () == '\n') | |
sort(words.begin(), words.end()); | |
for (int i = 0; i < words.size() - 1; ++i) { | |
cout << words[i] << " "; | |
} | |
cout << words[words.size() - 1] << endl; | |
words.clear(); | |
} | |
} | |
return 0; | |
} |
# 场景九:多行逗号分隔的字符串
输入描述:
多个测试用例,每个测试用例一行
每行通过 ',' 隔开,有 n 个字符,n < 100
输出描述:
对于每组用例输出一行排序后的字符串,用 ',' 隔开,无结尾空格
输入示例:
a,c,bb
f,dddd
nowcoder
输出示例:
a,bb,c
dddd,f
nowcoder
代码实现:
#include <iostream> | |
#include <string> | |
#include <vector> | |
#include <sstream> | |
#include <algorithm> | |
using namespace std; | |
int main() { | |
string str1, str2; | |
vector<string> words; | |
while (getline(cin, str1)) { | |
stringstream ss(str1); | |
while (getline(ss, str2, ',')) words.push_back(str2); | |
sort(words.begin(), words.end()); | |
for (int i = 0; i < words.size() - 1; ++i) { | |
cout << words[i] << ","; | |
} | |
cout << words[words.size() - 1] << endl; | |
words.clear(); | |
} | |
return 0; | |
} |
参考: