在进行组合时会发生除零

时间:2016-09-21 17:55:53

标签: c++ error-handling combinations

我试图计算数学组合。我使用的公式是N! / K! (N-K)!

我能够从10N=5获得K=2120N=10的正确答案(K=3)。

但是当我尝试使用更大的数字进行测试时,N=50K=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;

2 个答案:

答案 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或类似的东西。