博客主页:[小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C++
文章目录
- 💯前言
- 💯题目描述
- 💯解题分析
- [💯为什么 `n` 需要是 `long long`](#💯为什么
n
需要是long long
) -
- 问题重点:中间计算水平上的数据类型
-
- 不足的例子:
- [正确解决:将 `n` 设置为 `long long`:](#正确解决:将
n
设置为long long
:)
- 💯结论思考
- 💯小结
💯前言
- 在算法 和程序设计 中,对于输入范围大的结构 和计算结果 ,选择适宜的数据类型 是解决问题的关键手段之一 。
本文将基于一道计算和结果 的题目,对为什么需要将变量设置为long long
类型进行进一步分析 。我们不仅提供大量的代码简述 ,还将提供清晰的计算思路 ,并选择为课题作最优化答案 。这不仅方便读者入门学习 ,也能让读者受益于大数据算法 的思考。
C++ 参考手册
💯题目描述
小乐乐最近触碰了和符号∑,他想计算约等于
所有正整数:
∑ i = 1 n i \sum_{i=1}^n i i=1∑ni
但是小乐乐很苦惶,请你助助他解答。
输入描述
输入一个正整数【 1 ≤ n ≤ 10^9 】。
输出描述
输出一个值,为和结果。
示例1
- 输入:1
- 输出:1
示例2
- 输入:10
- 输出:55
💯解题分析
从题目的输入范围( 1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1≤n≤109)及计算公式:
∑ i = 1 n i \sum_{i=1}^n i i=1∑ni
可以看出,输入数据和计算过程中都需要进行大数操作。这里我们分析两个关键问题:
- 数据类型问题:为什么
n
需要是long long
? - 为什么不仅仅是
sum
是long long
,n
还要调整?
以下将分段说明:
💯为什么 n
需要是 long long
问题重点:中间计算水平上的数据类型
在 C++ 中,数据类型有对应的结构:
int
类型:可表示的范围 : − 2 31 to 2 31 − 1 ≈ − 2.1 × 1 0 9 to 2.1 × 1 0 9 -2^{31} \; \text{to} \; 2^{31}-1 \approx -2.1 \times 10^9 \; \text{to} \; 2.1 \times 10^9 −231to231−1≈−2.1×109to2.1×109long long
类型:可表示的范围 : − 2 63 to 2 63 − 1 ≈ − 9 × 1 0 18 to 9 × 1 0 18 -2^{63} \; \text{to} \; 2^{63}-1 \approx -9 \times 10^{18} \; \text{to} \; 9 \times 10^{18} −263to263−1≈−9×1018to9×1018
该题目中,当 n = 1 0 9 n = 10^9 n=109 ,计算
sum = n × ( n + 1 ) 2 = 1 0 9 × 1 0 9 + 1 2 ≈ 5 × 1 0 17 \text{sum} = \frac{n \times (n + 1)}{2} = \frac{10^9 \times 10^9 + 1}{2} \approx 5 \times 10^{17} sum=2n×(n+1)=2109×109+1≈5×1017
如果将 n
设置为 int
:
- 在计算
n \times (n + 1)
时,因为是int
类型,系统会使用int
实现计算,结果会 满达int
范围并发生溢出,为错误值。
不足的例子:
cpp
#include <iostream>
using namespace std;
int main() {
int n = 1000000000; // n 设为 int
long long sum = (n * (n + 1)) / 2; // 会发生溢出
cout << sum << endl; // 错误结果
return 0;
}
在这个例子中,虽然 sum
是 long long
,但因为 n
是 int
,n * (n + 1)
还是在 int
级别上计算的,实际结果已经满达了 int
的范围,即满时数字溢出。
正确解决:将 n
设置为 long long
:
cpp
#include <iostream>
using namespace std;
int main() {
long long n; // 将 n 设为 long long
cin >> n;
long long sum = (n * (n + 1)) / 2;
cout << sum << endl; // 正确结果
return 0;
}
💯结论思考
最好的习惯是:
- 根据输入范围,正确选择数据类型
- 如果结果的计算中存在满达一个类型范围的情况,优先通过动态符合级别进行匹配。
💯小结
通过本文对为什么需要使用long long
解决大范围数据计算 的解释,我们可以看出,选择合适的数据类型 不仅能避免溢出 ,还能保证代码的正确性 。在这之上,习惯检查计算过程中的数据体积 ,是查测与解决漂浮问题 的重要技巧。结合上面的分析,应用于大量比较大的输入 ,使用并保持较大的计算类型 ,优化数据流通关系 ,是一份不可缺少的思考方式。