2011-07-03 5 views
8

매우 큰 곱셈의 자릿수 (각각 약 300 자릿수)를 찾아야합니다. 실제로 계산을 수행하지 않고 제품이 될 자릿수를 예측하는 트릭이 있는지 궁금합니다. 다음곱셈의 자릿수 예측

+0

다른 염기에 대해 보유 그것의 n은 자릿수가 통상적으로 약 2 * N. – cristobalito

+1

'floor (log x) * floor (log y) <= 숫자 (x * y) <= ceil (log x) * ceil (log y)'log base 10. – davin

+0

@critobalito 더 많은 n + m 여기서 n과 m은 각 표현식의 자릿수입니다. 예 : '9 * 9 = 81'' 999 * 9 = 8991' – Lynch

답변

22

자릿수는 두 피승수의 base 10 log 플러스 1의 반올림 (아래)를 합 정확하게을 계산할 수있다

public static void main(String[] args) { 
    DecimalFormat f = new DecimalFormat("#"); 
    double num1 = 123456789d; 
    double num2 = 314159265358979d; 

    // Here's the line that does the work: 
    int numberOfDigits = (int) (Math.log10(num1) + Math.log10(num2)) + 1; 

    System.out.println(f.format(num1) + " * " + f.format(num2) + " = " + 
     f.format((num1 * num2)) + ", which has " + numberOfDigits + " digits"); 
} 

출력 :

123456789* 314159265358979 = 3878509413969699000000000000000000, which has 34 digits 

이것은 임의로 큰 숫자에 대해 작동합니다.

+0

이것은 내 대답보다 훨씬 낫다. – Tom

+0

당신의 반응에 대해 많은 사람들에게 감사하지만,이 하나는 케이크를 가져 간다. 감사. – Deho

+2

물론 10 진수 *를 원하면 'log10'입니다. 더 일반적으로, 우리가 base-k 위치 시스템에서 숫자를 원하면'log_k'입니다. –

6

크리스토 발리토의 대답은 거의 알 수 있습니다. "about"을 좀 더 정확하게 만들어 보겠습니다.

첫 번째 숫자가 n 자이고 두 번째 숫자가 m이라고 가정합니다. 가능한 가장 낮은 값은 각각 10^(n-1) 및 10^(m-1)입니다. 그 제품은 가장 낮을 것이고 10^(m + n-2)이 될 것이고 이것은 m + n-1 자릿수입니다.

가장 높은 값은 각각 10^n - 1 및 10^m - 1입니다. 그 제품은 될 수있는 최고 수준이며, 10^(n + m) - 10^n - 10^m + 1이고, m + n 자리 이하입니다.

따라서 n 자리 숫자에 m 자리 숫자를 곱하면 제품의 m + n-1 또는 m + n 숫자가됩니다.

유사 논리는 기지국 2

+0

다른 포스터가 설명하는 기본 10 로그는 간단한 기술. 그러나 기본 2 로그를 찾아 (log 2)/(log 10)으로 곱하면 약 0.693입니다. 기본 2 로그는 이진 표현에서 최상위 1의 위치를 ​​찾음으로써 부동 소수점에 의지하지 않고 찾을 수 있습니다. 그런 다음 69를 곱하고 정수를 100으로 나누면 정수 연산 이외의 연산을 사용하지 않고 대략적인 자리 수를 찾아야합니다. 아마도 실제로 이런 일을해서는 안될 가치가 있기 때문에 아마도 이것을해서는 안됩니다. 귀여워, 그래, 안 그래? –

+0

여기에 답변에 의견을 추가하지 않으시겠습니까? –

+0

나는 실제적으로 진정으로 유용하지는 않을 것이라고 믿기 때문에. –