#P503. 【入门题】【输入篇④】A+B+C+... Problem (多行输入版)

【入门题】【输入篇④】A+B+C+... Problem (多行输入版)

题目描述:

给定若干行输入,每一行由若干个整数组成,要求对每行的整数进行求和,并输出每行的和。输入数据的行数未知,当输入结束时,程序停止。

输入:

  • 每行包含若干个由空格分隔的整数。
  • 输入以文件结束符(EOF)结束。

输出:

  • 对于每一行,输出一行,表示该行所有整数的和。

输入样例:

1 2 3
4 5 6 7
8 9

输出样例:

6
22
17

数据范围:

  • 每行最多包含 100 个整数。
  • 每个整数的范围为 109x109-10^9 \leq x \leq 10^9

题解:多行不定组输入的处理

本题与单行不定组输入的区别在于,我们需要处理多行输入,而不仅仅是单行输入。在单行不定组输入的情况下,我们只需要一次性读取整行数据并处理。而在多行输入的场景中,输入行数是不定的,程序需要循环不断读取每一行数据并分别进行处理。这就要求我们不仅要处理每行的数据,还需要在输入结束时能够识别并终止读取。具体请看代码实现!

各语言实现

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():将字符串数组转换为整数并进行求和。

关键点总结

  1. EOF 处理

    • 所有语言的输入在未给定行数时,需要持续读取输入,直到遇到 EOF 结束(例如,手动输入 Ctrl+D 在 Linux/Mac 或 Ctrl+Z 在 Windows 来表示结束)。
    • 各语言有不同的方式处理 EOF,比如 C++ 中的 while(getline),Java 的 hasNextLine(),Python 的 sys.stdin,以及 Go 的 bufio.Scanner()
  2. 多行输入处理

    • 每次读取一行输入后,需要将其按空格分割,得到一组不定个数的整数。
    • 对每行输入的整数进行求和后,输出结果。
  3. 字符串分割与整数转换

    • 输入数据为字符串形式,需要将其按空格分割并转换为整数才能进行求和。

这个题目的重点是处理不定组的输入,使用合适的方法读取直到输入结束,并对每行进行解析和处理。通过这个题目可以熟练掌握各语言中处理多行不定输入的技巧。