2011-07-03 2 views
8

Мне нужно найти количество цифр очень больших умножений (около 300 цифр каждый). Мне было интересно, есть ли уловка, чтобы предсказать количество цифр, которое будет у продукта, фактически не выполнив расчет.Прогнозирование числа цифр умножения

+0

Это обычно примерно 2 * п, где п число цифр. – cristobalito

+1

Вы можете связать количество цифр следующим образом: 'floor (log x) * floor (log y) <= цифры (x * y) <= ceil (log x) * ceil (log y)' база данных 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

Конечно, это только 'log10', если мы хотим число * десятичных цифр *. В более общем смысле, это 'log_k', если мы хотим цифры в базовой системе base-k. –

6

Ответ Кристобабито в значительной степени получает его. Позвольте мне сделать «около» более точным:

Предположим, что первое число имеет 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,963. Логарифм базы 2 можно найти, не прибегая к плавающей точке, просто найдя положение наиболее значимого 1 в двоичном представлении. Если затем умножить на 69 и целое число на 100, вы должны найти приблизительное количество цифр, не используя ничего, кроме целых операций. Вы, наверное, никогда не должны этого делать, потому что это, вероятно, никогда не стоило бы того. Симпатичный, правда, нет? –

+0

Почему бы не написать свой комментарий здесь, чтобы ответить? –

+0

Потому что я считаю, что это вряд ли будет действительно полезно на практике. –