/// <summary>
/// 组合
/// </summary>
/// <param name="i">需要挑选几个</param>
/// <param name="n">总数</param>
/// <returns>组合的值</returns>
int combination(int i, int n) {
cout << "n: " << i << ",m: " << n << endl; //这里的n其实是i,m是n
//double res 会出现精度的问题
long long res = 1;
int k = i; //控制轮数
cout << "res: ";
while (k >= 1 && i >= 1)
{
//int flag = 0;
//比较是否能够除尽
while ((((double)(res * (n + 0.0f) / i) - (res * n / i)) != 0) && k >= 1)
{
res *= n;
n--;
k--;
cout << res << " ";
}
if (k < 1)
{
cout << "k: " << k << endl;
break;
}
res = res * n / i;
n--;
i--;
k--;
cout << res << " ";
}
while (i >= 1) {
res /= i--;
}
cout << endl;
return res;
}
因为这里会涉及到int越界与double不够精确的问题,所以我就直接使用long long res来充当返回值了
我输入的的i = 13,n = 22
圈红那边其实是53721360 * 16 = 859,541,760。
就很莫名其妙,都没有超过int的范围,我定义的res是long long 的
别人网站上的n = 50 , m = 100 都可以算的出来,这种算法应该怎么写