Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа a и b. Укажите наибольшее из таких чисел x, при вводе которого алгоритм печатает сначала 2, а потом 5.
| Бейсик | Python |
|---|---|
DIM X, A, B AS INTEGER INPUT X A = 0: B = 1 WHILE X > 0 A = A+1 B = B * (X MOD 100) X = X\100 WEND PRINT A PRINT B
| x = int(input()) a, b = 0, 1 while x > 0: a = a + 1 b = b * (x%100) x = x//100 print(a) print(b)
|
| Паскаль | Алгоритмический язык |
var x, a, b: integer; begin readln(x); a := 0; b := 1; while x > 0 do begin a := a+1; b := b*(x mod 100); x := x div 100; end; writeln(a); write(b); end.
| алг нач цел x, a, b ввод x a:=0; b:=1 нц пока x > 0 a := a+1 b := b*mod(x,100) x := div(x,100) кц вывод a, нс, b кон |
| Си++ | |
#include <iostream> using namespace std; int main() { int x, a, b; cin >> x; a = 0; b = 1; while (x > 0) { a = a+1; b = b * (x%100); x = x/100; } cout << a << endl << b << endl; }
| |
Рассмотрим цикл, число шагов которого зависит от изменения переменной x:
while x > 0 do begin
...
x:= x div 100;
end;
Т. к. оператор div возвращает целую часть от деления, то при делении на 100 это равносильно отсечению последних двух цифр.
На каждом шаге от десятичной записи x отсекается две последних цифры до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0. Для того, чтобы a стало равным 2, x должно быть трёхзначным или четырёхзначным.
Теперь рассмотрим изменение b:
while x>0 do begin
b:=b*(x mod 100);
end;
Оператор mod возвращает остаток от деления, при делении на 100 это последние две цифры x. Поскольку необходимо, чтобы число было наибольшим, первая цифра числа должна быть 5, во втором разряде должен быть либо ноль либо единица, а в первом — единица. Искомое число — 501.
Ответ: 501.
Приведём другое решение на языке Python.
for i in range(1000, 1, -1):
x = i
a, b = 0, 1
while x > 0:
a = a + 1
b = b * (x % 100)
x = x // 100
if a == 2 and b == 5:
print(i)
break

