#P503. 【入门题】【输入篇④】A+B+C+... Problem (多行输入版)
-
ID: 152
Type: Default
1000ms
256MiB
Tried: 73
Accepted: 28
Difficulty: 1
Uploaded By:
TaZi
Tags>入门教程
【入门题】【输入篇④】A+B+C+... Problem (多行输入版)
题目描述:
给定若干行输入,每一行由若干个整数组成,要求对每行的整数进行求和,并输出每行的和。输入数据的行数未知,当输入结束时,程序停止。
输入:
- 每行包含若干个由空格分隔的整数。
- 输入以文件结束符(EOF)结束。
输出:
- 对于每一行,输出一行,表示该行所有整数的和。
输入样例:
1 2 3
4 5 6 7
8 9
输出样例:
6
22
17
数据范围:
- 每行最多包含 100 个整数。
- 每个整数的范围为 −109≤x≤109。
题解:多行不定组输入的处理
本题与单行不定组输入的区别在于,我们需要处理多行输入,而不仅仅是单行输入。在单行不定组输入的情况下,我们只需要一次性读取整行数据并处理。而在多行输入的场景中,输入行数是不定的,程序需要循环不断读取每一行数据并分别进行处理。这就要求我们不仅要处理每行的数据,还需要在输入结束时能够识别并终止读取。具体请看代码实现!
各语言实现
1. C++ 实现
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string line;
while (getline(cin, line)) { // 持续读取直到 EOF
stringstream ss(line);
long long num, sum = 0;
while (ss >> num) { // 逐个读取每一行的整数
sum += num;
}
cout << sum << endl; // 输出这一行的和
}
return 0;
}
C++ 代码解析:
getline(cin, line)
:使用getline()
逐行读取输入,直到遇到文件结束符(EOF)。stringstream
:使用stringstream
对每行进行解析,并逐个提取其中的整数。- 循环处理:
while (cin)
循环会持续读取每一行输入,直到遇到 EOF。
2. Java 实现:使用 Scanner.hasNextLine()
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) { // 持续读取直到 EOF
String line = sc.nextLine();
String[] numbers = line.split(" ");
long sum = 0;
for (String num : numbers) {
if (!num.isEmpty()) { // 防止处理空字符串
sum += Long.parseLong(num);
}
}
System.out.println(sum); // 输出这一行的和
}
}
}
Java 代码解析:
sc.hasNextLine()
:在循环中判断是否还有下一行输入,直到输入结束。split(" ")
:使用split()
按空格分割每行输入,得到字符串数组。- 处理空字符串:避免因多余的空格导致空字符串解析错误。
3. Python 实现:使用 for line in sys.stdin
import sys
for line in sys.stdin: # 持续读取直到 EOF
numbers = map(int, line.split()) # 将每行按空格分割,并转换为整数
print(sum(numbers)) # 输出该行的和
Python 代码解析:
sys.stdin
:使用sys.stdin
来持续读取标准输入,直到 EOF。split()
:按空格分割输入行,并使用map(int, ...)
将分割出的字符串转换为整数。sum()
:对分割出的整数列表进行求和。
4. Go 实现:使用 bufio.Scanner
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin) // 创建读取器
for scanner.Scan() { // 持续读取直到 EOF
line := scanner.Text()
nums := strings.Fields(line) // 按空格分割
sum := 0
for _, num := range nums {
n, _ := strconv.Atoi(num) // 将字符串转换为整数
sum += n
}
fmt.Println(sum) // 输出和
}
}
Go 代码解析:
scanner.Scan()
:使用bufio.Scanner
持续读取每一行输入,直到遇到 EOF。strings.Fields()
:按空格分割每行输入,返回字符串数组。strconv.Atoi()
:将字符串数组转换为整数并进行求和。
关键点总结
-
EOF 处理:
- 所有语言的输入在未给定行数时,需要持续读取输入,直到遇到 EOF 结束(例如,手动输入
Ctrl+D
在 Linux/Mac 或Ctrl+Z
在 Windows 来表示结束)。 - 各语言有不同的方式处理 EOF,比如 C++ 中的
while(getline)
,Java 的hasNextLine()
,Python 的sys.stdin
,以及 Go 的bufio.Scanner()
。
- 所有语言的输入在未给定行数时,需要持续读取输入,直到遇到 EOF 结束(例如,手动输入
-
多行输入处理:
- 每次读取一行输入后,需要将其按空格分割,得到一组不定个数的整数。
- 对每行输入的整数进行求和后,输出结果。
-
字符串分割与整数转换:
- 输入数据为字符串形式,需要将其按空格分割并转换为整数才能进行求和。
这个题目的重点是处理不定组的输入,使用合适的方法读取直到输入结束,并对每行进行解析和处理。通过这个题目可以熟练掌握各语言中处理多行不定输入的技巧。
通知
扫码备注华为交流群~期待您的到来
- 湘ICP备2023007293号
- Worker 0, 21ms
- Powered by Hydro v4.14.1 Community