ДАЮ 50 БАЛЛОВ!!! ПАСКАЛЬ Вводится шестизначное натуральное число. Проверить, является ли оно счастливым (сумма первых трёх цифр равна сумме последних трёх цифр) и, если не является, вывести ближайшее счастливое число.
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).
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).
1) Вместо двух отдельных сумм по три цифры и их сравнения- тут я сделал общую сумму (но правые три цифры берутся со знаком минус) - в результате сумма должна быть равна нулю
2) Сделано приведение числа в диапазон шестизначных (т.е. можно ввести любое целое число, хоть отрицательное- и программа найдёт ближайшее к нему счастливое шестизначное положительное)
3) Диапазон шестизначных я начал с 100 001 потому, что это первое счастливое в этом диапазоне, число перед ним (100 000) нет смысла проверять
4) Поиск ближайшего счастливого одновременно идёт и вверх и вниз от введённого пользователем числа. В третьей версии это сделано двумя отдельными циклами (в первом к центральному числу прибавляется смещение, а во втором- отнимается). В первой и второй версии- цикл один, и знак смещения получается из младшего двоичного разряда переменной цикла (n), а сама величина смещения- из остальных двоичных разрядов переменной n.
2 votes Thanks 1
Ziorar
Простая на for ... to (убрал повторы в доп. цикл): 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.
Ziorar
Простая (на циклах repeat ... until) 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.
Answers & Comments
Вот несколько версий такой программы (все ищут ближайшее счастливое число сразу и вверх и вниз):
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);
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.
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.