2011-07-03 12 views
8

Potrzebuję znaleźć liczbę cyfr bardzo dużych mnożeń (około 300 cyfr każda). Zastanawiałem się, czy istnieje sztuczka pozwalająca przewidzieć liczbę cyfr, którą będzie dany produkt, bez faktycznego wykonywania obliczeń.Przewidywanie liczby cyfr mnożenia

+0

Jest to zwykle około 2 * n, gdzie n oznacza liczbę cyfr. – cristobalito

+1

Możesz ograniczyć liczbę cyfr w następujący sposób: 'floor (log x) * floor (log y) <= cyfry (x * y) <= ceil (log x) * ceil (log y)' log base 10. – davin

+0

@critobalito to więcej n + m gdzie n i m to liczba cyfr każdego wyrażenia. na przykład '9 * 9 = 81'' 999 * 9 = 8991' – Lynch

Odpowiedz

22

Liczba cyfr można obliczyć dokładnie przez zaokrąglone (w dół) suma base 10 log dwóch mnożnych plus 1, w następujący sposób:

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"); 
} 

wyjściowa:

123456789* 314159265358979 = 3878509413969699000000000000000000, which has 34 digits 

To zadziała dla dowolnie dużych liczb.

+0

To jest o wiele lepsze niż moja odpowiedź :) – Tom

+0

dziękuję bardzo wszystkim za odpowiedzi, ale ten bierze tort. dzięki. – Deho

+2

Oczywiście, to tylko 'log10', jeśli chcemy liczbę * cyfr dziesiętnych *. Bardziej ogólnie, jest to 'log_k', jeśli chcemy cyfr w systemie pozycyjnym base-k. –

6

Odpowiedź Cristobalito prawie na nie wpływa. Pozwolę sobie bardziej precyzyjnie określić "około":

Załóżmy, że pierwsza liczba ma n cyfr, a druga ma m. Najniższe mogą być odpowiednio 10^(n-1) i 10^(m-1). Ten produkt byłby najniższy, jaki mógłby być, i wynosiłby 10^(m + n-2), co stanowi liczbę m + n-1.

Najwyższe mogą być odpowiednio 10^n - 1 i 10^m - 1. Ten produkt byłby najwyższy, jaki mógłby być, i wynosiłby 10^(n + m) - 10^n - 10^m + 1, co najwyżej m + n cyfr.

Tak więc jeśli mnożysz liczbę n-cyfrową przez liczbę m-cyfr, produkt będzie miał cyfry m + n-1 lub m + n.

podobne rozwiązanie odnosi się do innych zasad, takich jak bazy 2.

+0

Logarytm podstawowy 10, który opisują inne plakaty, jest prosta technika. Można jednak znaleźć logarytm podstawy 2 i pomnożyć przez (log 2)/(log 10), który wynosi około 0,693. Logarytm podstawy 2 można znaleźć bez uciekania się do punktu zmiennoprzecinkowego, po prostu znajdując pozycję najbardziej znaczącego 1 w reprezentacji binarnej. Jeśli pomnożysz przez 69 i liczbę całkowitą podziel przez 100, powinieneś znaleźć przybliżoną liczbę cyfr, nie używając niczego oprócz operacji całkowitych. Prawdopodobnie nigdy nie powinieneś tego robić, ponieważ prawdopodobnie nigdy nie będzie to warte problemów. Słodkie, ale nie? –

+0

Dlaczego nie dodać tutaj komentarza do odpowiedzi? –

+0

Ponieważ uważam, że jest mało prawdopodobne, aby był rzeczywiście użyteczny w praktyce. –