整数溢出或低效编码?

问题描述 投票:0回答:1

我试图编写这个问题的解决方案,即“计算从 到(给定)n 的所有整数的总和”

我最初的代码如下,我相信它工作得很好

#include <bits/stdc++.h>
using namespace std;

int main () {
    int n;
    cin >> n;
    long long sum = 0;
    for(int i = 1; i <= n; i++) {
        sum += i;
    }
    cout << sum << endl;
    return 0;
}

然而,突然有一种冲动想要制作一个“替代”代码,并且基本上不使用循环来完成它。 众所周知,数学中有一个1到n之和的公式,那就是:

sum(1, n) = ((n) * (n + 1)) / 2
,对吧? 所以我们的想法是简单地使用这个公式。 虽然它对于小数字(例如 1000)工作正常,但当我输入相对较大的数字(例如 1000000)时,会出现错误(?)。 所以就像 1000000 一样,答案应该是 500,000,500,000,而通过第二个代码,输出将是 -363189984,这很奇怪,对吧?

  1. 嗯,据我所知和理解,这些类型的“错误”是由于变量的类型而发生的,特别是对于这种情况,
    long long
    ,不够大,无法容纳一些数字,因此它们“崩溃”或不管它叫什么。 然而,在这种情况下,我不认为这都是因为长时间无法保存像 500,000,500,000 这样的数字,而是因为将这些数字相乘的操作(1000000 和 1000000+1),这导致这场灾难的发生,因此产生了狡猾的输出。

所以我的问题是, 首先,我的说法正确吗?如果不是,这段代码的实际问题是什么? 其次,我该如何解决这个问题(比如我是否需要使用更大的变量,或者只是这段代码根本不“高效”)

c++ debugging variable-types
1个回答
0
投票

实际发生的情况是,

long long
可能无法在数字限制时保持您想要的值。由于C和C++内部主要以补码对数字进行编码,因此当出现溢出时,它可以表示为负值。

为了避免这些问题,如果您需要任意大小的整数值,您必须使用或编写自己的库。

© www.soinside.com 2019 - 2024. All rights reserved.