#P502. 【入门题】【输入篇③】A+B+C+... Problem (单行输入版)

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

题目描述:

给定一行由若干个整数组成的数字序列,求这些整数的和。

输入:

输入只有一行,包含若干个整数,整数之间以空格分隔。

输出:

输出一个整数,表示这一行中所有整数的和。

输入样例:

1 2 3 4 5

输出样例:

15

数据范围:

  • 每个整数的范围为 109x109-10^9 \leq x \leq 10^9

  • 最多包含 1000 个整数

题解:处理单行不定组输入

这道题的核心在于处理不定组输入,即在一行内输入多个整数,整数之间以空格分隔。我们需要根据输入的内容灵活地解析并处理。这种问题在大厂笔试中经常出现,下面塔子哥会讲解如何在几种常见编程语言中处理这类问题。

问题解析

  1. 输入特点:题目中的输入的某一部分是一行由空格分隔的整数。输入的整数数量是不定的,可以有任意个整数。因此,需要编写代码来灵活读取并解析这类输入。
  2. 输出:我们需要对输入的整数进行求和,并将结果输出。

各语言实现

1.C++ 实现

在 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;
}

代码详解:

  1. while (cin >> num)

    • 这是一个常见的 C++ 输入模式。cin 会从标准输入中读取整数,并存入变量 num 中。只要读取成功,循环就会继续进行。
    • 当输入结束(例如按 Ctrl+D 在 Linux/Mac 或 Ctrl+Z 在 Windows)或者遇到非法输入时,cin 会返回 false,循环终止。
  2. 累加和

    • 每次成功读取一个整数后,将其累加到 sum 中,直到无法再读取时输出结果。注意,我们使用 long long 类型的变量 sum 来避免当输入的整数非常大时的int溢出

2. Java 实现

在 Java 中,我们也可以使用 Scannerwhile 循环来处理不定组输入。与 C++ 中类似,ScannerhasNext() 方法可以用于判断是否还有输入内容,配合 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();  // 关闭输入流
    }
}

代码详解:

  1. while (sc.hasNextInt())

    • hasNextInt() 方法检查输入流中是否还有下一个整数。如果有,则返回 true,否则返回 false,这可以用来控制循环持续读取整数,直到输入结束。
    • 这种方式可以处理不定组输入,直到输入结束或者遇到非整数输入。
  2. 累加和

    • 每次通过 sc.nextInt() 读取一个整数并将其累加到 sum 中。注意,我们使用 long 类型的变量 sum 来避免当输入的整数非常大时可能的int溢出

3. Python 实现

numbers = map(int, input().split())  # 将输入按空格分割,并转为整数
print(sum(numbers))  # 输出和

Python 解题思路:

  • input().split()input() 读取一行输入,split() 按空格分割字符串,返回一个字符串列表。
  • map(int, ...):通过 map(int, ...) 将分割后的字符串列表转换为整数列表。
  • sum():Python 中内置的 sum() 函数可以直接对列表中的整数求和。Python 的 int 类型支持自动扩展,不用担心整数溢出。

4. Go 实现

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)  // 输出和
}

Go 解题思路:

  • fmt.Scanln():用于读取一行输入。
  • strings.Split():通过 strings.Split() 按空格分割字符串,得到一个字符串数组。
  • strconv.Atoi():将字符串转换为整数并求和。需要处理可能的转换错误,但这里可以忽略错误。

不定组输入是大厂笔试算法题中的常见模式,通过学习如何处理这些问题,可以提高在笔试中处理灵活输入的能力。