以下是我要解决的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
作为输出,但事实并非如此。代码有什么问题?
答案 0 :(得分:3)
当您执行算术运算时,如果结果太大,结果将不会提升为更宽的类型
由于n
为int
,而1
和6
为int
,因此整个计算均使用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==2000
为n
,则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);`
)。