【C++】小乐乐求和题目分析n变量类型讨论



博客主页:小ᶻ☡꙳ᵃⁱᵍᶜ꙳ 本文专栏: C++


文章目录



💯前言

  • 算法程序设计 中,对于输入范围大的结构计算结果 ,选择适宜的数据类型 是解决问题的关键手段之一
    本文将基于一道计算和结果 的题目,对为什么需要将变量设置为 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

可以看出,输入数据和计算过程中都需要进行大数操作。这里我们分析两个关键问题:

  1. 数据类型问题:为什么 n 需要是 long long
  2. 为什么不仅仅是 sumlong longn 还要调整?

以下将分段说明:


💯为什么 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×109
  • long 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;
}

在这个例子中,虽然 sumlong long,但因为 nintn * (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;
}

💯结论思考

最好的习惯是:

  1. 根据输入范围,正确选择数据类型
  2. 如果结果的计算中存在满达一个类型范围的情况,优先通过动态符合级别进行匹配。

💯小结


  • 通过本文对为什么需要使用 long long 解决大范围数据计算 的解释,我们可以看出,选择合适的数据类型 不仅能避免溢出 ,还能保证代码的正确性 。在这之上,习惯检查计算过程中的数据体积 ,是查测与解决漂浮问题 的重要技巧。结合上面的分析,应用于大量比较大的输入 ,使用并保持较大的计算类型优化数据流通关系 ,是一份不可缺少的思考方式


相关推荐
handler016 小时前
【C++】二叉搜索树详解及其模拟实现(代码)
开发语言·c++·算法·c··二叉搜索树·搜索树
爱学习的程序媛1 天前
C 语言全景指南:从底层原理到工业级实战
c++·c#·c
dozenyaoyida3 天前
RISC-V嵌入式开发:彻底解决“undefined reference to isatty“错误全攻略
经验分享·c·cmake·嵌入式开发·isatty·没有定义问题
Shadow(⊙o⊙)4 天前
模拟实现:glibc_1.0-文件操作函数fopen fclose fwrite fflush实现。
开发语言·c++·学习·c
liulilittle5 天前
TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法
linux·网络·c++·tcp/ip·算法·c·通讯
weixin_421725266 天前
C语言、C++与C#深度研究报告:从底层控制到现代企业级开发的演进
c语言·c++·c·内存管理·编译模型
不吃土豆的马铃薯8 天前
Spdlog 入门:日志记录器与日志槽基础详解
服务器·开发语言·c++·c·日志·spdlog
金创想8 天前
积木移动题目分析及解题思路——木块问题(1)
c++·算法·字符串·c·刷题·信息学奥赛·积木
不吃土豆的马铃薯11 天前
5.SGI STL 二级空间配置器 _S_chunk_alloc核心函数解析
开发语言·c++·vscode·c·内存池
一只小灿灿12 天前
深度详解计算机补码原理
c·补码