我正在尝试学习C++,因此我正在尝试做一个函数来计算二项式系数。代码最高可达 n 的 12,对于较大的值,生成的结果不正确。感谢您的投入。
long double binomial(int n, int k) {
int d = n-k;
int i = 1, t = 1, n1 = 1, n2 = 1;
if (d == 0) {
return 1;
} else if (n==0) {
return 1;
} else {
while (i <=n) {
t *= i;
if (i == d) {
n1 = t;
cout << t;
}
if (i == k) {
n2 = t;
cout << t;
}
i++;
}
}
return t/n1/n2;
}
int main() {
int n, k;
cout << "Select an integer n: n";
cin >> n;
cout << "Select an integer k: n";
cin >> k;
long double v = binomial(n,k);
cout << "The binomial coefficient is: " << v << "n";
return 0;
}
int
变量只能容纳一定大小的数字。这因编译器和平台而异,但典型的限制约为 20 亿。您的程序使用的数字大于该值,因此会出现错误。
如果你想用大整数计算,答案是得到一个大整数库。GMP是一种流行的。
如果int
在你的系统上是32位长(现在很常见),那么13的阶乘不适合它(6227020800 > 2147483647
)。
要么过渡到更大的东西(unsigned long long
,有人吗?),要么使用bigint库,或者想出一个更好/更聪明的算法,不涉及计算大阶乘,至少不直接计算。
其中一个建议是使用其他类型。
以下是整数类型、大小和限制的列表。
--------------------------------------------------------------------------------------
|type |size (B)|Limits |
--------------------------------------------------------------------------------------
|long long |8 |–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807|
--------------------------------------------------------------------------------------
|unsigned long long |8 |0 to 18,446,744,073,709,551,615 |
--------------------------------------------------------------------------------------
|int |4 |–2,147,483,648 to 2,147,483,647 |
--------------------------------------------------------------------------------------
|unsigned int |4 |0 to 4,294,967,295 |
--------------------------------------------------------------------------------------
|short |2 |–32,768 to 32,767 |
--------------------------------------------------------------------------------------
|unsigned short |2 |0 to 65,535 |
--------------------------------------------------------------------------------------
|char |1 |–128 to 127 |
--------------------------------------------------------------------------------------
|unsigned char |1 |0 to 255 |
--------------------------------------------------------------------------------------
注意 long
和int
通常大小相同。
请注意,这些限制在所有体系结构上都不相同,标准仅保证变量大小的两件事:
- 1 =
sizeof(char)
=sizeof(unsigned char)
- 2 =
sizeof(shor)
=sizeof(unsigned short)
<=sizeof(int)
=sizeof(unsigned int)
<=sizeof(long)
=sizeof(unsigned long)
<=sizeof(long long)
=sizeof(unsigned long long)
另一种选择是使用 bigint 库,但是在这种情况下,计算将花费更多时间,但会适合。