문제

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가 매우 큰 경우 데이터의 작업은 시간이 걸릴 것입니다 (숫자가 여러 바이트의 배열로 표시되므로).작은 계산 시간을 피할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top