【发布时间】:2014-11-21 10:50:26
【问题描述】:
这是一个非常简单的程序,有 t 个测试用例,我们必须找到 nCr=n!/r!*(n-r)!。 所以它适用于较小的值,如 20C2,但不适用于较大的值,如 100C10。它给出 32C2=-6 ,100C10 浮点异常。 如何使它为 1注意:我不是要求 long double 或不想将其更改为 float。答案应该类似于 100C10 = 17310309456440 类似 989C45=?
#include<iostream>
using namespace std;
long long int fact(long long int num);
int main()
{
int t;
cin>>t;
long long int n[1000],r[1000],c[1000];
for(int i=0;i<t;i++)
{
cin>>n[i];
cin>>r[i];
}
for(int i=0;i<t;i++)
{
c[i]=fact(n[i])/(fact(r[i])*fact(n[i]-r[i])) ;
cout<<c[i];
}
return 0;
}
long long int fact(long long int num){
long long int k;
if(num==0)
num=1;
else
{
for(k=num-1;k>0;k--)
num=num*k;
}
return num;
}
【问题讨论】:
-
您需要任意长度的整数。该语言没有内置任何内容,因此您需要自己做(将大数存储在一个较小值的数组中并编写一个函数来相乘和打印它们)或使用像 GMP 这样的库
-
你可以通过召唤数学的古老力量来摆脱阶乘,避免溢出。
-
我应该使用 unsigned 吗?
-
没有标准类型适合 1000C500,无论是无符号还是有符号。
-
我不明白为什么这是重复的。如果您想扩大答案的范围,无论您如何简化表达式,都应该考虑使用像 boost 这样的多精度库。
标签: c++ algorithm math combinators binomial-coefficients