PascalАВС.NЕТ 3.8.3 build 3238: изменения в библиотеке School
1. Digits
Функция Digits(n) и расширение n.Digits позволяют получить список List<integer>, содержащий цифры десятичного числа n. Теперь у Digits появился необязательный целочисленный параметр base, позволяющий указать основание системы счисления, в которой требуется получить цифры числа. При основании, превышающем 10, каждая "цифра" числа представляется соответствующим десятичным числом. Поскольку основание может быть многоразрядным числом, такие "цифры" тоже могут оказаться многоразрядными. Например, рассмотрим представление числа 1234567890 в системе счисления по основанию 2023. Очевидно, что каждая "цифра" представления может находиться в интервале [0;2022].
Понятно, что в данном случае бессмысленно говорить о каком-то специальном алфавите, позволяющий одним символом представить любую из 2023 "цифр". Поэтому было принято решение оставить числа "как есть" и записывать представление числа 1234567890 по основанию 2023 как [301, 1342, 1795]. Но ведь в таком виде это коэффициенты полинома P(2023), представленные в порядке убывания степеней числа 2023. Отсюда возникла идея ввести функцию, выполняющую обратную операцию: по списку коэффициентов полинома получить числовое значение полинома. А это равнозначно переводу числа из системы счисления по заданному основанию в десятичную систему. Так в библиотеке School появились функция и расширение DigitsToInt64.
2. DigitsToInt64
Функция DigitsToInt64(L, base) и расширение L.Digits(base) позволяют перевести число из расширенной формы представления в системе счисления по основанию base в десятичную систему счисления. Здесь L - список типа List<integer>, полученный в результате использования Digits или созданный иным способом. По умолчанию base = 10 и в этом случае параметр можно опускать.
Эту же функцию можно использовать для вычисления значения полинома по упорядоченному списку коэффициентов.
3. Практическое применение
Перевести число 105516 в шестнадцатиричную систему счисления и сделать проверку обратным переводом в десятичную систему.
## uses School;
var q := 105516.Digits(16);
q.Println; // 1 9 12 2 12
q.DigitsToInt64(16).Print // 105516
Найти сумму "цифр" десятичного числа 7456330, представленного в системе счисления по основанию 43.
## uses School;
7456330.Digits(43).Sum.Print // 70
Решить задачу №5823 из задания 14 с сайта К.Ю. Полякова.
(А. Богданов) Операнды арифметического выражения записаны в системе счисления с некоторым частично заданным основанием (основания указаны в скобках - замечание моё):
В записи чисел переменной x обозначена неизвестная цифра. Определите наибольшее значение x, при котором абсолютное значение данного арифметического выражения при делении на 100 даёт остаток 53. Для найденного значения x вычислите целое частное от деления абсолютного значения арифметического выражения на 100 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.
## uses School;
for var x := 9 downto 0 do
begin
var v := Abs(Lst(1, 3).DigitsToInt64(13200 + 10 * x + 4) -
Lst(1, 3, x, 4, 2).DigitsToInt64(22));
if v mod 100 = 53 then
begin
Print(v div 100); // 2554
break
end
end