Var N,C,k,d:integer; Begin Write('N = ');ReadLn(N); For N:= 1 to N do Begin C:=N; k:=0; d:=0; While C<>0 do Begin k:=k+1; if C mod 10 <> 0 then if N mod (C mod 10) = 0 then d:=d+1; C:= C div 10 End; if d=k then Write(N,' ') End; End.
Сначала посмотрим, какое из чисел больше. Как в обычной арифметике: если вдруг надо вычесть из меньшего большее, мы вычитаем из большего меньшее и ставим в ответе знак минус. Требуется сделать вычитание (группировка разрядов по 4 сделана для удобства чтения): 111 0001 1011 - 101 0011 0101
Тут все хорошо, из большего вычитается меньшее. Вычитаем "в столбик", как обычные числа, но помним, что система счисления двоичная, поэтому когда из 0 вычитается единица, то мы "занимаем единичку" у старшего разряда, уменьшая его на 1. Но, поскольку цифр-то всего две - 0 и 1, то заняв единицу в старшем разряде, мы понимаем, что там останется 0 или 1. А когда мы занимаем единицу? Да лишь тогда, когда от 0 должны отнять 1. Единичка из старшего разряда - это 10₂, т.е. на самом деле обычная десятичная двойка, и после вычитания из 10₂ единицы, получим единицу. Как итог, в разряде: 0-0=0 1-1=0 1-0=1 0-1=1 и при этом в соседнем слева разряде надо тоже вычесть единицу по этим же правилам.
N,C,k,d:integer;
Begin
Write('N = ');ReadLn(N);
For N:= 1 to N do
Begin
C:=N;
k:=0;
d:=0;
While C<>0 do
Begin
k:=k+1;
if C mod 10 <> 0 then
if N mod (C mod 10) = 0 then d:=d+1;
C:= C div 10
End;
if d=k then Write(N,' ')
End;
End.
Пример:
N = 2017
1 2 3 4 5 6 7 8 9 11 12 15 22 24 33 36 44 48 55 66 77 88 99 111 112 115 122 124 126 128 132 135 144 155 162 168 175 184 212 216 222 224 244 248 264 288 312 315 324 333 336 366 384 396 412 424 432 444 448 488 515 555 612 624 636 648 666 672 728 735 777 784 816 824 848 864 888 936 999 1111 1112 1113 1115 1116 1122 1124 1128 1131 1144 1155 1164 1176 1184 1197 1212 1222 1224 1236 1244 1248 1266 1288 1296 1311 1326 1332 1335 1344 1362 1368 1395 1412 1416 1424 1444 1448 1464 1488 1515 1555 1575 1626 1632 1644 1662 1692 1715 1722 1764 1771 1824 1848 1888 1926 1935 1944 1962