我正在尝试计算Pascal三角形的第100行中的特定条目是否可以被3整除。我是使用公式nCr计算的,其中n = 100,r是第100行中的不同条目。 我正在使用以下代码来计算组合
public static double Combination(int n, int m, double comb)
{
for (int r = -1; ++r < m; )
comb = comb * (n - r) / (r + 1);
return comb;
}
但对于像100C16这样的值,我会得到包含十进制和e的大数字。 我在互联网上搜索发现实际上有12个数字不能被3整除,但我的程序给了我63个数字,这些数字在第100行中不能被3整除,这是错误的。可以告诉我这是什么我是做错了。
答案 0 :(得分:1)
我假设“nCr”是n-choose-r的简写,或者从N中选择r,对吗?
要查看nCr是否可以被3整除,您不需要计算结果,只需要弄清楚它是否可以被3整除。您必须看到n多少次!可被3整除,然后r多少倍!可被3整除(n-r)!是
这真的很简单 - 1!不能被3,2整除!不是,3!可以整除一次。 4!和5!也可以整除一次。 6!是两倍可分,7也是!和8! 9!可以整除4次,依此类推。一直到n(或计算公式而不用递增计算,这不是那么难),并检查。
澄清 - 我的数学学习在希伯来语中,所以“多少次n!可以被3整除”可能不是正确的英语说法。通过“n!可被3 m整除”我的意思是n!=3^m*k
,其中k根本不能被3整除。
编辑:一个例子。让我们看看10c4是否可以被3整除。
让我们做一个小桌子,说k多少次!可以被3整除(k!列仅用于演示,在计算divisiblity列时实际上并不需要它):
k k! Divisibility
1 1 0
2 2 0
3 6 1
4 24 1
5 120 1
6 720 2
7 5040 2
8 40320 2
9 362880 4
10 3628800 4
10c4是10! /(6!* 4!)。
10!可被整除4次(意思是10!= 3 ^ 4 *不能被3整除的东西), 6!是可分2次 4!可以1次整除
所以10! (6!* 4!)可被3整除。实际上是3 * 70。
答案 1 :(得分:1)
首先你使用的是双打,我认为这不是一个好主意。浮点数会在一段时间后出错。
如果数字不会增长,那么巨大的数字可以使用以下方法:
public static long nCr (int m, int n) {
long tmp = 1;
int j = 2;
int k = m-n;
for(int i = m; i > k; i--) {
tmp *= i;
while(j <= n && tmp%j == 0) {
tmp /= j++;
}
}
while(j <= n) {
tmp /= j++;
}
return tmp;
}
在这种情况下,这仍然是不够的。在这种情况下,可以使用BigInteger
System.Numerics
结构
public static BigInteger nCr (int m, int n) {
BigInteger tmp = 1;
int j = 2;
int k = m-n;
for(int i = m; i > k; i--) {
tmp *= i;
while(j <= n && tmp%j == 0) {
tmp /= j++;
}
}
while(j <= n) {
tmp /= j++;
}
return tmp;
}
你可以说,使用BigInteger不需要交错分割和乘法。但是,如果BigInteger非常大,则对数据的操作将花费一些时间(因为该数字表示为多个字节的数组)。通过保持较小,可以避免较长的计算时间。