给定一行由若干个整数组成的数字序列,求这些整数的和。
输入只有一行,包含若干个整数,整数之间以空格分隔。
输出一个整数,表示这一行中所有整数的和。
1 2 3 4 5
15
每个整数的范围为 −109≤x≤109
最多包含 1000 个整数
这道题的核心在于处理不定组输入,即在一行内输入多个整数,整数之间以空格分隔。我们需要根据输入的内容灵活地解析并处理。这种问题在大厂笔试中经常出现,下面塔子哥会讲解如何在几种常见编程语言中处理这类问题。
在 C++ 中,我们可以直接使用 while (cin >> num)
来处理不定组输入。这种方式非常简洁,且适用于多个数据行的输入,不需要预先知道数据的数量。cin
在读取时会跳过空格和换行符,直到遇到文件结束符(EOF)或者输入流失败时才会停止。
#include <iostream>
using namespace std;
int main() {
long long num, sum = 0;
while (cin >> num) { // 只要能读取到数,就继续累加
sum += num;
}
cout << sum << endl; // 输出最终的和
return 0;
}
while (cin >> num)
:
cin
会从标准输入中读取整数,并存入变量 num
中。只要读取成功,循环就会继续进行。Ctrl+D
在 Linux/Mac 或 Ctrl+Z
在 Windows)或者遇到非法输入时,cin
会返回 false
,循环终止。累加和:
sum
中,直到无法再读取时输出结果。注意,我们使用 long long
类型的变量 sum
来避免当输入的整数非常大时的int
溢出在 Java 中,我们也可以使用 Scanner
和 while
循环来处理不定组输入。与 C++ 中类似,Scanner
的 hasNext()
方法可以用于判断是否还有输入内容,配合 nextInt()
方法可以逐个读取输入的整数。
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long sum = 0; // 用 long 来避免可能的溢出
while (sc.hasNextInt()) { // 当还有整数可以读取时
sum += sc.nextInt(); // 读取下一个整数并累加
}
System.out.println(sum); // 输出最终的和
sc.close(); // 关闭输入流
}
}
while (sc.hasNextInt())
:
hasNextInt()
方法检查输入流中是否还有下一个整数。如果有,则返回 true
,否则返回 false
,这可以用来控制循环持续读取整数,直到输入结束。累加和:
sc.nextInt()
读取一个整数并将其累加到 sum
中。注意,我们使用 long
类型的变量 sum
来避免当输入的整数非常大时可能的int溢出numbers = map(int, input().split()) # 将输入按空格分割,并转为整数
print(sum(numbers)) # 输出和
input().split()
:input()
读取一行输入,split()
按空格分割字符串,返回一个字符串列表。map(int, ...)
:通过 map(int, ...)
将分割后的字符串列表转换为整数列表。sum()
:Python 中内置的 sum()
函数可以直接对列表中的整数求和。Python 的 int
类型支持自动扩展,不用担心整数溢出。package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
var line string
fmt.Scanln(&line) // 读取整行输入
nums := strings.Split(line, " ") // 按空格分割字符串
sum := 0
for _, num := range nums {
n, _ := strconv.Atoi(num) // 将字符串转换为整数
sum += n
}
fmt.Println(sum) // 输出和
}
fmt.Scanln()
:用于读取一行输入。strings.Split()
:通过 strings.Split()
按空格分割字符串,得到一个字符串数组。strconv.Atoi()
:将字符串转换为整数并求和。需要处理可能的转换错误,但这里可以忽略错误。不定组输入是大厂笔试算法题中的常见模式,通过学习如何处理这些问题,可以提高在笔试中处理灵活输入的能力。
本题属于以下题库,请选择所需题库进行购买