
Nilarn
6 год назад
Напишите программу, которая вводит натуральное число N и выводит на экран все натуральные числа, не превосходящие N и делящиеся на каждую из своих цифр.
ОТВЕТЫ

Маврикий
Jul 7, 2019
// PascalABC.NET 3.2, сборка 1367 от 20.12.2016
// Внимание! Если программа не работает, обновите версию!
function NOK(a,b:integer):integer;
begin
if a=b then Result:=a
else begin
var c:=a*b;
repeat
if agt;b then a:=a-b else b:=b-a;
until a=b;
Result:=c div a
end
end;
begin
var n:=ReadInteger(N=);
var L:=new Listlt;integergt;;
var m:=n;
while mgt;0 do begin
var d:=m mod 10;
L.Add(d);
m:=m div 10
end;
var a:=L.Where(x-gt;xlt;gt;0).Distinct.ToArray;
var k:=a[0];
if a.Lengthgt;1 then
for var i:=1 to a.Length-1 do k:=NOK(k,a[i]);
Range(k,n,k).Println;
end.
Пример
N= 227
14 28 42 56 70 84 98 112 126 140 154 168 182 196 210 224
Как это работает
Если число делится на каждое из нескольких чисел, то оно делится и на НОД этих чисел, Функция НОД позволяет найти НОД пары чисел, а её применение несколько раз позволит найти НОД для необходимого набора чисел.
Создаем объект типа "список целых" и цифра за цифрой помещаем туда числа, совпадающие с цифрами заданного числа n. Затем просматриваем список и все уникальные элементы, за исключением нуля, заносим в массив а. Далее вычисляем НОД для всех элементов полученного массива.
Понятно, что первым в последовательности искомых чисел будет стоять НОД, а далее пойдут числа, которые будут увеличиваться каждый раз на НОД, пока не достигнут n.
// Внимание! Если программа не работает, обновите версию!
function NOK(a,b:integer):integer;
begin
if a=b then Result:=a
else begin
var c:=a*b;
repeat
if agt;b then a:=a-b else b:=b-a;
until a=b;
Result:=c div a
end
end;
begin
var n:=ReadInteger(N=);
var L:=new Listlt;integergt;;
var m:=n;
while mgt;0 do begin
var d:=m mod 10;
L.Add(d);
m:=m div 10
end;
var a:=L.Where(x-gt;xlt;gt;0).Distinct.ToArray;
var k:=a[0];
if a.Lengthgt;1 then
for var i:=1 to a.Length-1 do k:=NOK(k,a[i]);
Range(k,n,k).Println;
end.
Пример
N= 227
14 28 42 56 70 84 98 112 126 140 154 168 182 196 210 224
Как это работает
Если число делится на каждое из нескольких чисел, то оно делится и на НОД этих чисел, Функция НОД позволяет найти НОД пары чисел, а её применение несколько раз позволит найти НОД для необходимого набора чисел.
Создаем объект типа "список целых" и цифра за цифрой помещаем туда числа, совпадающие с цифрами заданного числа n. Затем просматриваем список и все уникальные элементы, за исключением нуля, заносим в массив а. Далее вычисляем НОД для всех элементов полученного массива.
Понятно, что первым в последовательности искомых чисел будет стоять НОД, а далее пойдут числа, которые будут увеличиваться каждый раз на НОД, пока не достигнут n.
ОТДЕЛ Задание+;
ИСПОЛЬЗУЕТ Вывод ИЗ "...\Отделы\Обмен\", Приём;
ПЕР
N, сч: ЦЕЛ;
ЗАДАЧА Делится_на_цифры(число: ЦЕЛ): КЛЮЧ;
ПЕР
ч: ЦЕЛ;
УКАЗ
ч := число;
ПОКА ч gt; 0 ВЫП
ЕСЛИ число ОСТАТОК (ч ОСТАТОК 10) # 0 ТО
ВОЗВРАТ ОТКЛ
КОН;
ч := ч ДЕЛИТЬ 10
КОН;
ВОЗВРАТ ВКЛ
КОН Делится_на_цифры;
УКАЗ
N := Приём.Число();
ОТ сч := 1 ДО N ВЫП
ЕСЛИ Делится_на_цифры(сч) ТО
Вывод.ЧЦел("^d", сч, 0, 0, 0)
КОН
КОН
КОН Задание.
ИСПОЛЬЗУЕТ Вывод ИЗ "...\Отделы\Обмен\", Приём;
ПЕР
N, сч: ЦЕЛ;
ЗАДАЧА Делится_на_цифры(число: ЦЕЛ): КЛЮЧ;
ПЕР
ч: ЦЕЛ;
УКАЗ
ч := число;
ПОКА ч gt; 0 ВЫП
ЕСЛИ число ОСТАТОК (ч ОСТАТОК 10) # 0 ТО
ВОЗВРАТ ОТКЛ
КОН;
ч := ч ДЕЛИТЬ 10
КОН;
ВОЗВРАТ ВКЛ
КОН Делится_на_цифры;
УКАЗ
N := Приём.Число();
ОТ сч := 1 ДО N ВЫП
ЕСЛИ Делится_на_цифры(сч) ТО
Вывод.ЧЦел("^d", сч, 0, 0, 0)
КОН
КОН
КОН Задание.
161