Последнее проверяемое число 7FF, поскольку большее число при удвоении будет четырехзначным, нарушая условие задания.
procedure Analyze(n: integer; var sd: integer; var has2: boolean); {Для заданного целого n возвращает: sd - сумму цифр в шестнадцатиричном представлении; has2 - true, если среди шестнадцитиричных цифр имеется хотя бы одна двойка.} const mask = $00F;
var i, r: integer;
begin has2 := false; sd := 0; for i := 1 to 3 do begin r := (n and mask); has2 := (has2 or (r = 2)); sd := sd + r; n := (n shr 4); end end;
function IsSuitable(n: integer): Boolean; {Проверяет, удовлетворяет ли число n набору условий}
var s1, s2: integer; has2, stub: boolean;
begin Analyze(n, s1, has2); Analyze(2 * n, s2, stub); IsSuitable := ((s1 = s2) and has2) end;
var i, n: integer;
begin n := 0; for i := $100 to $7FF do if IsSuitable(i) then n := n + 1; Writeln('Найдено чисел- ', n) end.
Во-первых, X1 < 8, иначе число 2N в 16-ной записи станет 4-значным. Можно написать такую программу поиска этих чисел Начало k = 0 ' Это счетчик чисел, которые мы ищем Цикл по X1 от 1 до 7 Цикл по Y1 от 0 до 15 Цикл по Z1 от 0 до 15 N = X1*256 + Y1*16 + Z1 M = 2*N X2 = Int (M / 256) Y2 = Int ((M - X2*256) / 16) Z2 = M Mod 16 Если (X1+Y1+Z1 = X2+Y2+Z2) And ((X1 = 2) Or (Y1 = 2) Or (Z1 = 2), То k = k + 1 Конец Если Конец цикла по Z1 Конец цикла по Y1 Конец цикла по X1 Вывод k Конец
procedure Analyze(n: integer; var sd: integer; var has2: boolean);
{Для заданного целого n возвращает:
sd - сумму цифр в шестнадцатиричном представлении;
has2 - true, если среди шестнадцитиричных цифр имеется хотя бы одна двойка.}
const
mask = $00F;
var
i, r: integer;
begin
has2 := false;
sd := 0;
for i := 1 to 3 do
begin
r := (n and mask);
has2 := (has2 or (r = 2));
sd := sd + r;
n := (n shr 4);
end
end;
function IsSuitable(n: integer): Boolean;
{Проверяет, удовлетворяет ли число n набору условий}
var
s1, s2: integer;
has2, stub: boolean;
begin
Analyze(n, s1, has2);
Analyze(2 * n, s2, stub);
IsSuitable := ((s1 = s2) and has2)
end;
var
i, n: integer;
begin
n := 0;
for i := $100 to $7FF do
if IsSuitable(i) then n := n + 1;
Writeln('Найдено чисел- ', n)
end.
Результат выполнения программы:
Найдено чисел- 23
2N = X2*256 + Y2*16 + Z2
X1 + Y1 + Z1 = X2 + Y2 + Z2
Во-первых, X1 < 8, иначе число 2N в 16-ной записи станет 4-значным.
Можно написать такую программу поиска этих чисел
Начало
k = 0 ' Это счетчик чисел, которые мы ищем
Цикл по X1 от 1 до 7
Цикл по Y1 от 0 до 15
Цикл по Z1 от 0 до 15
N = X1*256 + Y1*16 + Z1
M = 2*N
X2 = Int (M / 256)
Y2 = Int ((M - X2*256) / 16)
Z2 = M Mod 16
Если (X1+Y1+Z1 = X2+Y2+Z2) And ((X1 = 2) Or (Y1 = 2) Or (Z1 = 2), То
k = k + 1
Конец Если
Конец цикла по Z1
Конец цикла по Y1
Конец цикла по X1
Вывод k
Конец