P501.【入门题】【输入篇②】A+B Problem 加强版
题目描述:
给定两个整数 A 和 B,请计算它们的和并输出结果。
输入:
输入包含一行,包含两个整数 A 和 B,以空格分隔。
输出:
输出一行,包含一个整数,表示 A 和 B 的和。
输入样例:
3 5
输出样例:
8
数据范围:
−1015≤A,B≤1015
教程
在这道题目中,我们需要计算两个整数 A 和 B 的和。虽然看起来是简单的 A+B 问题,但由于数据范围较大,需要特别注意整型溢出的问题。
请C++/Go/Java选手牢记int的数据范围并且在写算法题的过程中时刻注意计算数据范围。虽然实际工作中用不到但是大厂算法真题很喜欢考察这一点。
重要的事情讲三遍,大厂机试题很喜欢考察爆int这个点。忘开int可能导致从100分变50分
重要的事情讲三遍,大厂机试题很喜欢考察爆int这个点。忘开int可能导致从100分变50分
重要的事情讲三遍,大厂机试题很喜欢考察爆int这个点。忘开int可能导致从100分变50分
问题分析
数据范围如下:
−1015≤A,B≤1015
两个 1015 级别的数相加,最大可能达到:
A+B=2×1015
而常规的 int 类型(在许多编程语言中是 32 位整数)无法处理这么大的数。通常,int 的范围是:
−231≤int≤231−1
也就是大约 −2.1×109 到 2.1×109。显然,这无法存储两个 1015 的数之和。因此,我们需要选择更大的数据类型。
编程语言中的大数处理
- C++:使用
long long 类型,范围是 −263 到 263−1。
- Java:使用
long 类型,范围同样是 −263 到 263−1。
- Python:Python 的
int 类型自动支持任意大小的整数,因此不需要特殊处理。
- Go:使用
int64 类型,范围是 −263 到 263−1。
各语言实现
C++ 实现
#include <iostream>
using namespace std;
int main() {
long long a, b; // 使用 long long 来存储大数
cin >> a >> b; // 读取两个 long long 类型的数
cout << a + b << endl; // 输出它们的和
return 0;
}
Java 实现
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long a = sc.nextLong(); // 使用 long 类型读取大数
long b = sc.nextLong(); // 使用 long 类型读取大数
System.out.println(a + b); // 输出它们的和
}
}
Python 实现
a, b = map(int, input().split()) # Python 的 int 自动扩展
print(a + b) # 输出它们的和
Go 实现
package main
import "fmt"
func main() {
var a, b int64 // 使用 int64 来存储大数
fmt.Scanf("%d %d", &a, &b) // 读取两个 int64 类型的整数
fmt.Println(a + b) // 输出它们的和
}
重要提示
为什么需要使用 long long 或 int64?
原因在于 int 类型无法处理题目中要求的数值范围。普通的 int 类型通常是 32 位的,能够表示的数值范围是:
−231≤int≤231−1
即大约 −2.1×109 到 2.1×109。而题目中的数据范围可达 1015,如果使用 int 类型,可能会出现溢出,导致计算错误。例如:
int a = 1000000000;
int b = 1000000000;
cout << a + b << endl; // 错误输出:-294967296 (溢出)
这是因为 int 类型无法存储超过 231−1 的数值,结果发生了溢出,导致输出错误的结果。
总结
- 在处理大数问题时,选择合适的数据类型至关重要。在 C++ 中使用
long long,在 Java 中使用 long,在 Go 中使用 int64。
- Python 自动支持大整数,因此不需要特殊处理。
- 确保在程序中正确处理题目所给的数据范围,避免运行时的溢出错误。