#P4222. 【入门题】【输入篇④】A+B+C+... Problem (多行输入版)
-
ID: 3290
Tried: 28
Accepted: 9
Difficulty: 1
【入门题】【输入篇④】A+B+C+... Problem (多行输入版)
解题思路
给定若干行输入,每行都是若干个用空格分隔的整数,要求对每一行单独求和并输出。读到文件结束符(EOF)时结束程序。
核心做法是逐行读取输入,然后将该行的字符串解析为整数序列,进行线性求和并输出结果。算法上,本题等价于对每行执行一次线性扫描与累加(可视为一次简单的前缀和/累加器应用)。 实现要点:
-
使用按行读取而不是按 token 读取,保证“每行一结果”的输出要求。
-
每行解析后用整型(64 位)累加,避免溢出(单行最多 100 个、每个在 ±1e9 内,和在 ±1e11 内,64 位足够)。
-
由于题面仅给出空格分隔的形式:
- Python:按要求“当需要字符串分割时优先使用
literal_eval
”,因此优先尝试用ast.literal_eval
把整行解析成列表/元组;若该行并非合法的 Python 序列(如“1 2 3”),则回退到基于空格分割的常规解析。 - C++/Java:按照要求“优先使用替换字符+输入流”,采用读取整行后用字符串流/分割解析。
- Python:按要求“当需要字符串分割时优先使用
代码实现
Python
# -*- coding: utf-8 -*-
# 题意:逐行读取,解析为整数列表后求和,输出每行的和
# 说明:按要求,当需要字符串分割时,优先尝试使用 literal_eval;
# 若该行不是合法的 Python 序列(例如 "1 2 3"),则回退到按空格分割。
import sys
import ast
def parse_line_to_ints(line):
"""将一行文本解析为整数列表。
优先尝试使用 literal_eval 解析成列表/元组;失败则回退空格分割。
"""
s = line.strip()
if not s:
return [] # 空行处理:返回空列表
# 尝试 literal_eval(如 "[1, 2, 3]" 或 "(1, 2, 3)")
try:
obj = ast.literal_eval(s)
if isinstance(obj, (list, tuple)):
return [int(x) for x in obj] # 转为整型
# 若 literal_eval 成功但不是列表/元组,则回退空格分割
except Exception:
pass
# 回退:按空格分割(例如 "1 2 3")
return [int(x) for x in s.split()]
def sum_list(nums):
"""对整数列表求和"""
total = 0
for v in nums:
total += v
return total
def main():
# 从标准输入逐行读取直到 EOF
for line in sys.stdin:
nums = parse_line_to_ints(line)
# 题面默认数据合法;空行可选择输出 0 或跳过,这里输出 0 更直观
print(sum_list(nums))
if __name__ == "__main__":
main()
Java
// 题意:逐行读取输入,对每行的整数求和并输出
// 说明:类名为 Main(ACM 风格)。使用 BufferedReader 按行读取,
// 然后按空格分割解析为 long,累加后输出。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
// 外部函数:对 long 数组求和
public static long sumArray(long[] arr) {
long total = 0L;
for (long v : arr) total += v;
return total;
}
public static void main(String[] args) throws IOException {
// 按行读取直到 EOF
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
line = line.trim();
if (line.length() == 0) {
// 空行:输出 0(也可选择跳过,这里选择输出 0)
System.out.println(0);
continue;
}
// 按空格分割,转为 long
String[] parts = line.split("\\s+");
long[] arr = new long[parts.length];
for (int i = 0; i < parts.length; i++) {
arr[i] = Long.parseLong(parts[i]);
}
long ans = sumArray(arr);
System.out.println(ans);
}
}
}
C++
// 题意:逐行读取输入,对每行整数求和并输出
// 说明:使用 getline 按行读入,再用 istringstream 解析整数(替换字符+输入流的思路)。
#include <bits/stdc++.h>
using namespace std;
// 外部函数:对向量求和(使用 64 位以防溢出)
long long sumVector(const vector<long long>& a) {
long long s = 0;
for (long long v : a) s += v;
return s;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string line;
// 逐行读取直到 EOF
while (getline(cin, line)) {
// 使用字符串流解析该行的整数
istringstream iss(line);
vector<long long> nums;
long long x;
while (iss >> x) {
nums.push_back(x);
}
// 空行时 nums 为空,按需输出 0
cout << sumVector(nums) << "\n";
}
return 0;
}
题目描述:
给定若干行输入,每一行由若干个整数组成,要求对每行的整数进行求和,并输出每行的和。输入数据的行数未知,当输入结束时,程序停止。
输入:
- 每行包含若干个由空格分隔的整数。
- 输入以文件结束符(EOF)结束。
输出:
- 对于每一行,输出一行,表示该行所有整数的和。
输入样例:
1 2 3
4 5 6 7
8 9
输出样例:
6
22
17
数据范围:
- 每行最多包含 100 个整数。
- 每个整数的范围为 −109≤x≤109。