Codeforces 268B - 未知值作为此小型C ++程序的输出

时间:2015-09-07 09:56:52

标签: c++ integer-overflow

以下是我要解决的Codeforces problem的C ++代码:

#include <iostream>

using namespace std;

int main()
{
    int n = -1;
    unsigned long long possible_combinations = 0;

    cin >> n;

    possible_combinations = (((n - 1) * n * (n + 1)) / 6) + n;
    cout << possible_combinations;

    return 0;
}

其中1 <= n <= 2000

它计算n的小值的正确值,但是当我使用2000时,它会显示 - 18446744073611230851。我只试过几个测试用例。

我知道公式是正确的,程序应该将1333335000作为输出,但事实并非如此。代码有什么问题?

2 个答案:

答案 0 :(得分:3)

当您执行算术运算时,如果结果太大,结果将不会提升为更宽的类型 由于nint,而16int,因此整个计算均使用int完成。

1999 * 2000 * 2001非常大 - 7,999,998,000 - int溢出。

始终使用unsigned long long

答案 1 :(得分:2)

试试这个:

possible_combinations = (((unsigned long long) (n - 1) * n * (n + 1)) / 6) + n;

问题的原因很简单:如果(n - 1) * n * (n + 1)int n==2000n,则int对于int来说太大了,所以此表达式返回n)。因此,您可以要求编译器使用更大的类型(语言不能使类型自动更宽)或只更改unsigned long longn = -1;的类型(使用int n = -1;而不是byte[] picbin = (byte[])(binary data in datbase); ImageConverter ic = new ImageConverter(); System.Drawing.Image img = (System.Drawing.Image)ic.ConvertFrom(picbin);` )。