我试图计算数学组合。我使用的公式是N! / K! (N-K)!
。
我能够从10
,N=5
获得K=2
,120
和N=10
的正确答案(K=3
)。
但是当我尝试使用更大的数字进行测试时,N=50
,K=5.
弹出整数除零错误。
我尝试使用finalAns
定义long int
,但它不起作用。有什么想法吗?
int N;
int init;
int K;
int factN = 1;
int factK = 1;
double finalAns;
cout << "Input of N = ";
cin >> N;
cout << "Input of K = ";
cin >> K;
int subs = N - K;
int factsubs = 1;
for (init = 1; init <= N; init++)
{
factN = factN * init;
}
for (init = 1; init <= K; init++)
{
factK = factK * init;
}
cout << "K is " << factK << endl;
for (init = 1; init <= subs; init++)
{
factsubs = factsubs * init;
}
finalAns = factN / (factK * factsubs);
cout << N << "C" << K << " is " << finalAns << endl;
答案 0 :(得分:1)
您需要改变一次乘法的方法。
N!
。 展开 N!/(N-K)! * K!
的表达式,以尽可能多地适应 中间 步骤中的除法操作,以减少溢出。
不要单独计算N!
或(N-K)!
或K!
,您更有可能遇到溢出问题。而是使用最终你需要划分大数字的事实,为什么不之前它变得 BIG !
更多提示:
N!/(N-K)! = multiply i[N..N-K+1] one by one //not i[N..1]
并检查值f
的任何因子(j from [2..K]
)是否完美地划分了中间产品值(p
),如果是,则执行除法:{{1} }和p = p/f
。
答案 1 :(得分:0)
10!非常大:3.628.800 - 如果这个很大,想象50!
根据您使用的编译器,您可能会处理好的15!用多久。然而,这还不够大 - 所以你需要做一些其他事情......你可以制作一个返回字符数组的乘法算法 - 没有办法返回一个long int或类似的东西。