Если лень перебирать вручную, можно воспользоваться программой
var k,l,r,x,f:integer; begin f := 3001; l := 0; r := 65534; x := (l + r) div 2; k := 1; while (x <> f) and (l < r) do begin writeln(k,' ',l,' ',r,' ',x); k := k + 1; if f < x then r := x - 1 else l := x + 1; x := (l + r) div 2 end; writeln(k,' ',l,' ',r,' ',x); end.
// 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 a>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 List<integer>; var m:=n; while m>0 do begin var d:=m mod 10; L.Add(d); m:=m div 10 end; var a:=L.Where(x->x<>0).Distinct.ToArray; var k:=a[0]; if a.Length>1 then for var i:=1 to a.Length-1 do k:=NOK(k,a[i]); Range(k,n,k).Println; end.
Как это работает? Если число делится на каждое из нескольких чисел, то оно делится и на НОД этих чисел, Функция НОД позволяет найти НОД пары чисел, а её применение несколько раз позволит найти НОД для необходимого набора чисел. Создаем объект типа "список целых" и цифра за цифрой помещаем туда числа, совпадающие с цифрами заданного числа n. Затем просматриваем список и все уникальные элементы, за исключением нуля, заносим в массив а. Далее вычисляем НОД для всех элементов полученного массива. Понятно, что первым в последовательности искомых чисел будет стоять НОД, а далее пойдут числа, которые будут увеличиваться каждый раз на НОД, пока не достигнут n.
F=A+U F=A*B*C F =(A-B )*(A*B)