На вход алгоритма подаётся натуральное число Алгоритм строит по нему новое число R следующим образом.
1. Строится восьмеричная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
— если число N делится на 7, то к восьмеричной записи числа справа дописываются его последние две цифры;
— если число N не делится на 7, то остаток от деления числа N на 7 умножается на семь, а затем полученный результат в восьмеричном виде приписывается слева к восьмеричной записи.
Полученная таким образом запись является восьмеричной записью искомого числа R.
Например, для исходного числа 2110 = 258 результатом является число 25258 = 136510, для исходного числа 2210 = 268 результатом является число 7268 = 47010.
Укажите такое число N, для которого число R является наименьшим среди чисел, превышающих 500. В ответе это число запишите в десятичной системе счисления.
В ответе запишите это число в десятичной системе счисления.
Приведём решение на языке Python.
otv = c = 10**10
for n in range(20,2000):
s = oct(n)[2:]
if n%7==0:
s = s + s[-2:]
else:
s = oct((n%7)*7)[2:] + s
r = int(s,8)
if r > 500 and c > r:
otv = n
c = r
print(otv)
Приведём другое решение на языке Python.
f = lambda n: oct(7*v)[2:] + oct(n)[2:] if (v:=n%7) else (t:=oct(n)[2:]) + t[-2:]
spi = sorted([(v, n) for n in range(21, 2000) if (v:=int(f(n), 8)) > 500])
print(spi[0][1])
Ответ: 57.
Приведём решение Сергея Донец на PascalABC:
uses School;
begin
var minR := MaxInt;
var bestN := 0;
for var n := 21 to 5555 do begin
var t := ToBase(n, 8); // Восьмеричная запись числа N
var ost := n mod 7;
if ost = 0 then t := t + t?[^2:]
else t := ToBase(ost * 7, 8) + t;
var r := Dec(t, 8);
if (r > 500) and (r < minR) then
begin
minR := r;
bestN := n;
end;
end;
Println(bestN);
end.

