Сколько цифр в этой базе? - PullRequest
7 голосов
/ 04 декабря 2009

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

Например: Десятичное число 100006 может быть представлено 17,11,9,8,7,6,8 цифрами в базах 2,3,4,5,6,7,8 соответственно.

Итак, формула, которую я до сих пор получил, выглядит следующим образом: (log10 (num) / log10 (base)) + 1.

в C / C ++ Я использовал эту формулу для вычисления приведенных выше результатов.

long long int size = ((double)log10(num) / (double)log10(base)) + 1.0;

Но, к сожалению, формула не дает правильного ответа в некоторых случаях, например:

Number 8 in  base 2 : 1,0,0,0
Number of digits: 4
Formula returned: 3

Number 64 in  base 2 : 1,0,0,0,0,0,0
Number of digits: 7
Formula returned: 6

Number 64 in  base 4 : 1,0,0,0
Number of digits: 4
Formula returned: 3

Number 125 in  base 5 : 1,0,0,0
Number of digits: 4
Formula returned: 3

Number 128 in  base 2 : 1,0,0,0,0,0,0,0
Number of digits: 8
Formula returned: 7

Number 216 in  base 6 : 1,0,0,0
Number of digits: 4
Formula returned: 3

Number 243 in  base 3 : 1,0,0,0,0,0
Number of digits: 6
Formula returned: 5

Number 343 in  base 7 : 1,0,0,0
Number of digits: 4
Formula returned: 3

Итак, ошибка на 1 цифру. Я просто хочу, чтобы кто-нибудь помог мне исправить формулу, чтобы она работала для всех возможных случаев.

Редактировать: В соответствии со спецификацией ввода мне приходится иметь дело со случаями, такими как 10000000000, т.е. 10 ^ 10, я не думаю, что log10 () в C / C ++ может обрабатывать такие случаи? Поэтому любая другая процедура / формула для этой проблемы будет высоко оценена.

Ответы [ 13 ]

0 голосов
/ 04 декабря 2009

Проблемы округления с плавающей точкой.

log10(216) / log10(6) =  2.9999999999999996

Но вы не можете добавить 0.5 как предложено, потому что это не будет работать для следующих

log10(1295) = log10(6) = 3.9995691928566091   //    5, 5, 5, 5
log10(1296) = log10(6) = 4.0                  // 1, 0, 0, 0, 0

Возможно, использование функции log (value, base) позволит избежать этих ошибок округления.

0 голосов
/ 04 декабря 2009

Похоже, формула мне подходит:

Number 8 in  base 2 : 1,0,0,0
Number of digits: 4
Formula returned: 3

log10(8) = 0.903089
log10(2) = 0.301029

Division => 3

+1 => 4

Так что это определенно просто ошибка округления.

0 голосов
/ 04 декабря 2009

Может быть полезно включить функцию округления (например, + 0,5) в ваш код где-то: вполне вероятно, что деление производит (например) 2.99989787, к которому добавляется 1.0, что дает 3.99989787 и когда оно преобразуется в int Дает 3.

...