LINUX.ORG.RU

[Курант] Упражнение


0

1

Значит так, в книге есть упражнение, которое не дает мне покоя. Хотелось бы, чтобы вы мне помогли разобраться, что именно требуется. Привожу текст упражнения:

Исследуйте в общем виде вопрос о представлении чисел в системе с основанием a. Чтобы называть числа в этой системе, нужны наименования для однозначных чисел 0, 1, ..., a − 1 и для различных степеней a: a, a^2, a^3, . . . Сколько именно числительных потребуется, чтобы назвать все числа до одной тысячи в системах с основанием a = 2, 3, 4, 5, . . . , 15? Каково должно быть основание a, чтобы число этих имен числительных было наименьшим? (Примеры: если a = 10, то нужно десять числительных для однозначных чисел. Затем еще три числительных, обозначающих 10, 100 и 1000, всего — 13. При a = 20 нужно двадцать числительных для однозначных чисел и еще числительные для 20 и 400; всего — 22. При a = 100 понадобится 101 числительное.)

Линукс тут при том, что СС касается и его в том числе.

Перемещено post-factum из General


Всё же ясно написано, что для позиционной системы счисления нужны названия для цифр (ноль, один, два, три, …, девять для десятичной) и для позиций (десять, сто, тысяча). Например, 382 — это «три сотни, восемь десятков, два». Вот и надо сосчитать, сколько нужно названий в данной системе счисления, чтобы назвать все натуральные числа от 1 до 1000. Т.е. для десятичной нужны 10 цифр и 3 позиции, т.е. 13 названий.

gentoo_root ★★★★★
()
Ответ на: комментарий от Temp

>Так как, например, в 8-ой системе это будет выглядеть?

Цифр у нас 8 (ноль, один, два, три, четыре, пять, шесть, семь). Нам хватит 4-значных чисел, чтобы назвать все числа до тысячи (тысяча — это 1750 в восьмеричной системе), но трёхзначных не хватит. Поэтому нужны названия для 3 позиций (единицы не считаем). Например, для 8^1 — «восьмёрки», для 8^2 — «сотни», для 8^3 — «тысячи» (сами слова роли не играют, главное, что есть названия). Т.е. нужны 8 цифр и 3 названия разрядов — это 11 названий числительных всего.

gentoo_root ★★★★★
()

Аналитически тебе надо найти минимум N + Log(N, 1000) для целых чисел, где логарифм нужно округлить вверх.

(mapcar (lambda(n)(+ n (ceiling (log 1000 n)))) (range 2 15))
=> (12 10 9 10 10 11 12 13 13 14 15 16 17 18)
То есть среди всех ответов минимальный - у основания 4 (4 цифры + 5 для степеней).

anonymous
()

Кстати, французы число 80 не называют «восемь десятков», как мы, они говорят «четыре двадцатки».

anonymous
()
Ответ на: комментарий от anonymous

Забавно, не знал. Вообще, жаль что победили миллионы мух, и десятичная система стала основной в мире, двенадцатиричная всё-таки удобнее.

anonymous
()
Ответ на: комментарий от anonymous
(mapcar (lambda(n)(+ n (ceiling (log 1000 n)))) (range 2 15))
=> (12 10 9 10 10 11 12 13 13 14 15 16 17 18)

наверное ceiling надо заменить на floor или truncate? и отнять 1 - младшая степень не нуждается в наименовании. Но сути это не изменит - для 1000 «оптимальна» 4-ка.

yyk ★★★★★
()
Ответ на: комментарий от yyk

> наверное ceiling надо заменить на floor или truncate? и отнять 1 - младшая степень не нуждается в наименовании.

Да, конечно, старший разряд, который сам по себе больше 1000 не нужен, ceiling надо заменить на floor.

anonymous
()

Спасибо всем отписавшимся. ЛОР таки торт.

Temp
() автор топика
Ответ на: комментарий от anonymous

> Кстати, французы число 80 не называют «восемь десятков», как мы, они говорят «четыре двадцатки».

А ещё они картавят и гнусят

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.