ДАЮ 50 БАЛЛОВ!!!
ПАСКАЛЬ
Вводится шестизначное натуральное число. Проверить, является ли оно счастливым (сумма первых трёх цифр равна сумме последних трёх цифр) и, если не является, вывести ближайшее счастливое число.
Ответы на вопрос
Вот несколько версий такой программы (все ищут ближайшее счастливое число сразу и вверх и вниз):
1) обычная версия, лучше её и использовать (вроде должна работать везде), либо третью версию
var a,b,n,i,t,s: integer;
begin
write('Введите шестизначное натуральное число: ');
read(a);
n:=0;
repeat
n:=n+1;
t:=a+(n div 2)*(1-2*(n mod 2)); // младш.разряд-знак, остальные-число
if t<100001 then t:=100001;
if t>999999 then t:=999999;
b:=t;
s:=0;
for i:=0 to 5 do
begin
s:=s+(t mod 10)*(1-2*(i div 3)); // правые 3 цифры берём с минусом
t:=t div 10;
end;
until s=0;
write('Ближайшее счастливое число: ',b);
end.
2) самая короткая, но и сложная версия, т.к. используются специфичные преобразования и вообще всё ужато, не очень читаемо (будет работать только в PascalABC.NET. Я проверял в версии 3.4.2.1837).
begin
var a,b,n: integer;
a:=ReadInteger('Введите шестизначное натуральное число:');
repeat inc(n);
b:=min(max(a+(n div 2)*(1-n mod 2*2),100001),999999);
until b.ToString.Select((x,i)->x.ToDigit*(i<3?1:-1)).Sum=0;
print('Ближайшее счастливое число=',b);
end.
3) максимально простая, даже примитивная версия (тоже вроде должна работать везде). Единственное, что тут не совсем элементарно- это принудительный выход из цикла (команда break).
var
a,b,n,i,t,s: integer;
begin
write('Введите шестизначное натуральное число: ');
read(a);
for n:=0 to 1000 do
begin
t:=a+n;
if t>999999 then t:=999999;
b:=t;
s:=0;
for i:=1 to 6 do
begin
if i>3 then s:=s - t mod 10 else s:=s + t mod 10;
t:=t div 10;
end;
if s=0 then break;
t:=a-n;
if t<100001 then t:=100001;
b:=t;
s:=0;
for i:=1 to 6 do
begin
if i>3 then s:=s - t mod 10 else s:=s + t mod 10;
t:=t div 10;
end;
if s=0 then break;
end;
write('Ближайшее счастливое число: ',b);
end.
Примечания:
1) Вместо двух отдельных сумм по три цифры и их сравнения- тут я сделал общую сумму (но правые три цифры берутся со знаком минус) - в результате сумма должна быть равна нулю
2) Сделано приведение числа в диапазон шестизначных (т.е. можно ввести любое целое число, хоть отрицательное- и программа найдёт ближайшее к нему счастливое шестизначное положительное)
3) Диапазон шестизначных я начал с 100 001 потому, что это первое счастливое в этом диапазоне, число перед ним (100 000) нет смысла проверять
4) Поиск ближайшего счастливого одновременно идёт и вверх и вниз от введённого пользователем числа. В третьей версии это сделано двумя отдельными циклами (в первом к центральному числу прибавляется смещение, а во втором- отнимается). В первой и второй версии- цикл один, и знак смещения получается из младшего двоичного разряда переменной цикла (n), а сама величина смещения- из остальных двоичных разрядов переменной n.
var
a,b,m,n,i,t,s: integer;
begin
write('Введите шестизначное натуральное число: ');
read(a);
n:=0;
repeat
m:=1;
repeat
if m=1 then t:=a+n else t:=a-n;
if t<100001 then t:=100001;
if t>999999 then t:=999999;
b:=t;
s:=0;
for i:=1 to 6 do
begin
if i<=3 then s:=s + t mod 10 else s:=s - t mod 10;
t:=t div 10;
end;
m:=m+1;
until (s=0) or (m>2);
n:=n+1;
until s=0;
write('Ближайшее счастливое число: ',b);
end.
var
a,b,m,n,i,t,s: integer;
begin
write('Введите шестизначное натуральное число: ');
read(a);
for n:=0 to 1000 do
begin
for m:=1 to 2 do
begin
if m=1 then t:=a+n else t:=a-n;
if t<100001 then t:=100001;
if t>999999 then t:=999999;
b:=t;
s:=0;
for i:=1 to 6 do
begin
if i<=3 then s:=s + t mod 10 else s:=s - t mod 10;
t:=t div 10;
end;
if s=0 then break;
end;
if s=0 then break;
end;
write('Ближайшее счастливое число: ',b);
end.