Перед условием вы должны задать переменным значения s:=0, i:=1 если вы берете, например, n=20, как у вас может быть сумма равна 21? 1+2+3+4+5+...+19+20=???
На интервале с левой границей 500 первое число, кратное 13, равно 507, а первое число, кратное 17, равно 510. Числа, кратные 13, образуют последовательность 507, 520, 533, ..., а числа, кратные 17, образуют последовательность 510, 527, 544, ... Для решения задачи достаточно объединить эти последовательности в одну, упорядоченную по возрастанию и взять первых 20 её членов.
Как получить 507 и 510? Первое число m, не меньшее некоторого k и кратное n определяется по простому алгоритму. Пусть p = k mod n - остаток от целочисленного деления k на n. Если p=0, то m=k, в противном случае m=k+n-p. Проверим для k=500, n=13. p = 500 mod 13 = 6. p≠0 ⇒ m = 500+13-6 = 507.
Поскольку 17>13, в последовательности чисел, кратных 17, их не может быть больше половины искомого количества, т.е. больше 20/2=10. А десятый член последовательности 510, 257, ... это 510+9×17 = 663. Тем более, это значение не может быть превышено в последовательности чисел, кратных 13, их там будет (663-507)/13=12.
Окончательно: строим последовательности из 12 чисел ряда 507, 520, 533... и 10 чисел ряда 510, 527, 544, ... объединяем их в последовательность, упорядоченную по возрастанию и берем 20 первых ее членов.
PascalABC.NET 3.3.5, сборка 1660 от 20.04.2018 Внимание! Если программа не работает, обновите версию!
begin (SeqGen(12,507,t->t+13)+SeqGen(10,510,t->t+17)).OrderBy(t->t) .Distinct.Take(20).Println end.
PascalABC.NET 3.3.5, сборка 1660 от 20.04.2018 Внимание! Если программа не работает, обновите версию!
begin var n:=ReadInteger('n='); var d:array[1..4] of integer; for var i:=1 to 4 do begin d[5-i]:=n mod 10; n:=n div 10 end; if d[1]+d[2]=d[3]+d[4] then Writeln('Сумма двух первых цифр равна сумме двух последних'); if (d[1]+d[2]+d[3]+d[4]) mod 3 = 0 then Writeln('сумма цифр кратна трем'); if (d[1]*d[2]*d[3]*d[4]) mod 4 = 0 then Writeln('произведение цифр кратно четырем'); end.
Как получить 507 и 510? Первое число m, не меньшее некоторого k и кратное n определяется по простому алгоритму. Пусть p = k mod n - остаток от целочисленного деления k на n. Если p=0, то m=k, в противном случае m=k+n-p.
Проверим для k=500, n=13.
p = 500 mod 13 = 6. p≠0 ⇒ m = 500+13-6 = 507.
Поскольку 17>13, в последовательности чисел, кратных 17, их не может быть больше половины искомого количества, т.е. больше 20/2=10. А десятый член последовательности 510, 257, ... это 510+9×17 = 663. Тем более, это значение не может быть превышено в последовательности чисел, кратных 13, их там будет (663-507)/13=12.
Окончательно: строим последовательности из 12 чисел ряда 507, 520, 533... и 10 чисел ряда 510, 527, 544, ... объединяем их в последовательность, упорядоченную по возрастанию и берем 20 первых ее членов.
PascalABC.NET 3.3.5, сборка 1660 от 20.04.2018
Внимание! Если программа не работает, обновите версию!
begin
(SeqGen(12,507,t->t+13)+SeqGen(10,510,t->t+17)).OrderBy(t->t)
.Distinct.Take(20).Println
end.
Результат
507 510 520 527 533 544 546 559 561 572 578 585 595 598 611 612 624 629 637 646
Внимание! Если программа не работает, обновите версию!
begin
var n:=ReadInteger('n=');
var d:array[1..4] of integer;
for var i:=1 to 4 do begin
d[5-i]:=n mod 10;
n:=n div 10
end;
if d[1]+d[2]=d[3]+d[4] then
Writeln('Сумма двух первых цифр равна сумме двух последних');
if (d[1]+d[2]+d[3]+d[4]) mod 3 = 0 then
Writeln('сумма цифр кратна трем');
if (d[1]*d[2]*d[3]*d[4]) mod 4 = 0 then
Writeln('произведение цифр кратно четырем');
end.