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
Odpowiedz
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.
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.
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? –
Dlaczego nie dodać tutaj komentarza do odpowiedzi? –
Ponieważ uważam, że jest mało prawdopodobne, aby był rzeczywiście użyteczny w praktyce. –
- 1. pytanie dotyczące mnożenia karatsuba:
- 2. Generowanie liczby losowej N-cyfr
- 3. Sprawdź dwóch dziesiętnych liczby cyfr w ciąg
- 4. SQL uzyskanie dwóch ostatnich cyfr liczby całkowitej
- 5. Przewidywanie karty kredytowej w JavaScript
- 6. Równoległe przewidywanie
- 7. T SQL dziesiętny mnożenia
- 8. Przewidywanie kolizji kołem
- 9. Przewidywanie sekwencji postaci?
- 10. Wypełnianie w celu uzyskania określonej liczby cyfr w numerze
- 11. Najszybszy sposób na uzyskanie liczby cyfr na numerze?
- 12. dzielona pandy kolumna dataframe na podstawie liczby cyfr
- 13. Nie można wyłączyć przewidywanie tekstu
- 14. Przewidywanie - sieć neuronowa dla regresji
- 15. MySQL mnożenia macierzy
- 16. Algorytm mnożenia macierzy Boole'a
- 17. mnożenie macierzy kształtów mnożenia
- 18. Optymalizacja mnożenia .NET
- 19. Algorytm sumowania cyfr?
- 20. Wykonaj podział całkowity za pomocą mnożenia
- 21. Python - liczba cyfr w wykładniku
- 22. Problemy z szybkością mnożenia macierzy
- 23. 64-bitowy błąd mnożenia stałoprzecinkowego
- 24. Kolejność pierwszeństwa mnożenia i dzielenia
- 25. Implementacja dodatku za pomocą mnożenia
- 26. Przewidywanie rozmiaru bajtu bajtów zakodowanych w base64 []
- 27. Przewidywanie brakujących wartości danych w bazie danych
- 28. Ukryty model Markowa przewidywanie następnej obserwacji
- 29. Przewidywanie tematów LDA dla nowych danych
- 30. less przewidywanie z nowymi wartościami x
Jest to zwykle około 2 * n, gdzie n oznacza liczbę cyfr. – cristobalito
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
@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