# 场景一:多组空格分隔的两个正整数

输入描述:

输入包括两个正整数 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 into str until the delimitation character delim 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 from is and stores them into str 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;
}

参考: