많은 수의 조합을 계산합니다
-
10-12-2019 - |
문제
Pascal의 삼각형의 100 번째 행의 특정 항목이 3 또는 Not의 나눌 수있는 경우, 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과 같은 값은 10 진수와 E가 많은 수를 포함합니다. 나는 인터넷에서 검색했지만, 실제로는 3 명이 나눌 수없는 12 개의 숫자가 있지만, 우리의 프로그램은 나에게 틀린 100 번째 행에서 나눌 수없는 63 개의 번호를 제공합니다.잘못 해.
해결책
NCR "은 N-CONLET-R에 대한 단축이거나 N에서 R을 선택합니다.
NCR이 3만큼 나눌 수 있는지 확인하려면 결과를 계산할 필요가 없습니다. 3 씩 나눌 수 있으며 몇 번이나 r! 나눌 수있는 3 번, 몇 번 (N-R)! 다.
정말 꽤 간단합니다 - 1! 3, 2가 나눌 수 없습니다! 아니, 3! 한 번 나눌 수 있습니다. 4! 5 세! 한 번 나눌 수 있습니다. 6! 두 번 나눌 수 있으며 7 명입니다! 8 세!. 9! 나눌 수있는 4 번 등이 있습니다. 증분으로 계산하지 않고 수식을 일으키거나, 모든 것이 어려운 것은 아닙니다. 을 확인하십시오.
명확히 - 내 수학 연구 히브리어에서 어디에서나 "3 번 n! 3"에 의해 나눌 수 있습니다 "라고 말하는 적절한 영어 방식이 아닐 수도 있습니다. "N!"는 3m 번으로 나눌 수 있습니다 "나는 n!=3^m*k
, 여기서 k는 전혀 3으로 나눌 수 없다는 것을 의미합니다.
편집 : 예제. 10c4가 3. 인지 확인합시다.
몇 번 k를 말하는 작은 테이블을 만들어 봅시다! 3 (k! 컬럼은 데모를 위해서는 실제로 계산할 때 실제로 필요하지 않습니다).
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입니다.
다른 팁
첫 번째는 두 배를 사용하고 있습니다. 나는 그것이 좋은 생각이라고 생각하지 않습니다.부동 소수점 숫자는 잠시 후 오류를 제공합니다.
숫자가 성장하지 않으면 거대한 방법이 다음 방법을 사용할 수 있습니다.
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
struct를 사용할 수 있습니다.
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가 매우 큰 경우 데이터의 작업은 시간이 걸릴 것입니다 (숫자가 여러 바이트의 배열로 표시되므로).작은 계산 시간을 피할 수 있습니다.