c++ - 做组合时被零除

标签 c++ error-handling combinations

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

我可以用 10 得到正确答案 ( N=5 ) , K=2 , 和 120来自 N=10 , K=3 .

但是当我尝试使用更大的数字(如 N=50)进行测试时, K=5.弹出整数除以零的错误。

我试图定义 finalAnslong 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;

最佳答案

您需要改变一次乘法的方法。

  • 不要一次性计算N!
  • 利用任何两个正整数相除都会减少最终结果的事实,因此有利于相除得到较低的中间值。

展开 N!/(N-K)! 的表达式* K! 以在中间 步骤中容纳尽可能多的除法运算,以减少溢出的机会。

不要分别计算N!(N-K)!K!,你更有可能面临溢出问题。取而代之的是,最终您需要对大数进行除法,为什么不它变得之前就这样做呢!

更多提示:

N!/(N-K)! = multiply i[N..N-K+1] one by one //not i[N..1] 

并且,检查 [2..K] 中值 j 的任何因子 (f) 是否完美地划分中间产品值 (p),如果是,做除法:p = p/fj = j/f

关于c++ - 做组合时被零除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39623451/

相关文章:

node.js - 在 Gulp 中捕获所有未处理的错误

生成区间关系组合的算法

c++ - 为什么要向这个宏传递三个参数?

c++ - cxxfunction 错误消息,内联 R 包

c++ - 带有尾随返回类型的 final、override、const 的语法

c++ - 使用 #define 处理 if 语句错误

c++ - if/else 中的流提取

codeigniter - 如何关闭新的 codeigniter 4 错误报告

flash - 查找数组中的所有系列

combinations - 从 Smalltalk 中的集合生成所有组合