Стандартные задачи на циклы: различия между версиями
Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
UnREAL (обсуждение | вклад) Нет описания правки |
Mikst (обсуждение | вклад) |
||
(не показаны 73 промежуточные версии 3 участников) | |||
Строка 1: | Строка 1: | ||
__NOTOC__ | |||
== Простейшие алгоритмы == | == Простейшие алгоритмы == | ||
(в | === №1. Сумма вводимых целых чисел === | ||
<source lang="pascal"> | |||
begin | |||
var n := ReadInteger('Введите число слагаемых:'); | |||
var s := 0.0; | |||
for var i:=1 to n do | |||
begin | |||
var x := ReadReal($'Введите слагаемое №{i}:'); | |||
s += x; | |||
end; | |||
Println($'Сумма равна {s}'); | |||
end. | |||
</source> | |||
В алгоритме используются ''интерполированные'' строки вида $'Сумма равна {s}'. | |||
Они начинаются с $. Выражение в фигурных скобках, расположенное в такой строке, заменяется на его значение. | |||
=== №2. Произведение целых чисел === | |||
<source lang="pascal"> | |||
begin | |||
var n := ReadInteger('Введите число множителей: '); | |||
var p := 1.0; | |||
for var i:=1 to n do | |||
begin | |||
var x := ReadReal('Введите множитель: '); | |||
p *= x; | |||
end; | |||
Println($'Произведение равно {p}'); | |||
end. | |||
</source> | |||
=== №3. Двойной факториал n!!=n*(n-2)*(n-4)*...*2 (или 1) === | |||
<source lang="pascal"> | |||
begin | |||
var x := ReadInteger('Введите x: '); | |||
var p := 1; | |||
while x>=2 do | |||
begin | |||
p *= x; | |||
x -= 2; | |||
end; | |||
Println($'Двойной факториал равен {p}'); | |||
end. | |||
</source> | |||
=== №4. Сколько нечетных среди n введенных === | |||
<source lang="pascal"> | |||
begin | |||
var n := ReadInteger('Введите n: '); | |||
var c := 0; | |||
for var i:=1 to n do | |||
begin | |||
var x := ReadInteger('Введите целое число: '); | |||
if x mod 2 <> 0 then | |||
c += 1; | |||
end; | |||
println($'Количество нечетных равно {c}'); | |||
end. | |||
</source> | |||
=== №5. Защита от неверного ввода === | |||
<source lang="pascal"> | |||
begin | |||
var x: real; | |||
repeat | |||
x := ReadReal('Введите x>0: '); | |||
if x<=0 then | |||
Println('Неверный ввод'); | |||
until x>0; | |||
end. | |||
</source> | |||
=== №6. Табулирование функции f(x) на отрезке в точках, разбивающих отрезок на N частей === | |||
Дан отрезок [a,b] | |||
<source lang="pascal"> | |||
function f(x: real) := sin(x)*x; | |||
begin | |||
var N := ReadInteger('Введите N: '); | |||
Assert(N>0); | |||
var (a,b) := ReadReal2('Введите a и b: '); | |||
var h := (b-a)/N; | |||
var x := a; | |||
loop N+1 do | |||
begin | |||
Writeln(x:5:2,f(x):10:4); | |||
x += h; | |||
end; | |||
end. | |||
</source> | |||
=== №6a. Решение, использующее while. Погрешность округления и вычислительная погрешность === | |||
<source lang="pascal"> | |||
function f(x: real): real:= sin(x)*x; | |||
begin | |||
var N:=ReadInteger('Введите N: '); | |||
Assert(N>0); | |||
var (a,b):=ReadReal2('Введите a и b: '); | |||
var h := (b-a)/N; | |||
var x := a; | |||
while x <= b+h/2 do | |||
begin | |||
writeln(x:5:2,f(x):10:4); | |||
x += h; | |||
end; | |||
end. | |||
</source> | |||
== Рекуррентные соотношения == | == Рекуррентные соотношения == | ||
=== №7. Вывод 10 первых степеней двойки === | |||
<source lang="pascal"> | |||
begin | |||
var x := 2; | |||
for var i := 1 to 10 do | |||
begin | |||
writeln(i:2,x:5); | |||
x *= 2; | |||
end; | |||
end. | |||
</source> | |||
=== №8. Вывод всех двухзначных чисел, кратных 5 === | |||
<source lang="pascal"> | |||
begin | |||
var x := 10; | |||
while x < 100 do | |||
begin | |||
writeln(x:3); | |||
x += 5; | |||
end; | |||
end. | |||
</source> | |||
=== №9. Вывод n первых чисел Фибоначчи === | |||
<source lang="pascal"> | <source lang="pascal"> | ||
begin | |||
var n := ReadInteger('Введите целое число n (n > 1): '); | |||
Assert(n>1); | |||
var (a,b) := (1,1); | |||
Print(a,b); | |||
loop n-2 do | |||
begin | begin | ||
var x := 2; | (a,b):=(b,a+b); | ||
for var i := 1 to | Print(b); | ||
end; | |||
end. | |||
</source> | |||
В алгоритме используются кортежи. В момент переприсваивания в цикле создаются буферные переменные, что позволяет нам избежать их объявления вручную. | |||
=== №10. Найти НОД(A,B), используя алгоритм Евклида: === | |||
НОД(A,B) = НОД(B,A mod B); НОД(A,0) = A | |||
<source lang="pascal"> | |||
begin | |||
var (a,b):=ReadInteger2('Введите целые числа A и B: '); | |||
while b<>0 do | |||
(A,B):=(B,A mod B); | |||
println($'НОД(A,B) = {A}'); | |||
end. | |||
</source> | |||
=== №11. Найти сумму цифр целого числа m === | |||
<source lang="pascal"> | |||
begin | |||
var m := ReadInteger('Введите целое число m: '); | |||
var (s,m1) := (0,abs(m)); | |||
while m1 > 0 do | |||
begin | |||
s += m1 mod 10; | |||
m1 := m1 div 10; | |||
end; | |||
println($'Сумма цифр числа {m} равна {s}'); | |||
end. | |||
</source> | |||
Для работы с отрицательными числами в алгоритме используется стандартная функция abs(x) возвращающая модуль от x. | |||
== Максимумы и минимумы == | |||
=== №12. Найти max из введенных чисел === | |||
<source lang="pascal"> | |||
begin | |||
var n := ReadInteger('Введите целое число n (n>0): '); | |||
assert(n>0); | |||
var x := ReadReal('Введите 1 число: '); | |||
var max := x; | |||
for var i := 2 to n do | |||
begin | |||
x := ReadReal($'Введите {i} число: '); | |||
if max < x then | |||
max := x; | |||
end; | |||
Println($'Максимальное из введенных чисел: {max}'); | |||
end. | |||
</source> | |||
=== №12a. Найти min, удовлетворяющее условию p(x) === | |||
<source lang="pascal"> | |||
// Условие взятое как пример (Если число положительное, то условие p(x) возвращает true, иначе false) | |||
function p(x: real): boolean:=x > 0; | |||
begin | |||
var n := ReadInteger('Введите целое число n (n>0): '); | |||
assert(n>0); | |||
var min := real.MaxValue; | |||
for var i := 1 to n do | |||
begin | |||
var x := ReadReal($'Введите {i} число: '); | |||
if (x < min) and p(x) then | |||
min := x; | |||
end; | |||
if min = real.MaxValue then | |||
println('Нет чисел, удовлетворяющих условию') | |||
else println($'Минимальное из введенных чисел, удовлетворяющее условию: {min}'); | |||
end. | |||
</source> | |||
== Суммирование рядов (конечных и бесконечных) == | |||
=== №13. Вычислить Σ(i=1..n) a^i/i! === | |||
<source lang="pascal"> | |||
begin | |||
var a:=ReadReal('Введите a: '); | |||
var n:=ReadInteger('Введите n (n>0): '); | |||
assert(n>0); | |||
var x := a; | |||
var s := x; | |||
for var i := 2 to n do | |||
begin | |||
x *= a / i; | |||
s += x; | |||
end; | |||
Println($'Сумма = {s}'); | |||
end. | |||
</source> | |||
=== №13a. Вычислить Σ(i=1..∞) (-1)^i * a^i/i! === | |||
<source lang="pascal"> | |||
begin | |||
var a:=ReadReal('Введите a (0 < a < 1): '); | |||
assert((a>0) and (a<1)); | |||
var eps := 0.0001; | |||
var i := 1; | |||
var s := 0.0; | |||
var y := -a; | |||
repeat | |||
s += y / i; | |||
i += 1; | |||
y *= -a; | |||
until abs(y/i) < eps; | |||
Println($'Сумма = {s}'); | |||
end. | |||
</source> | |||
== Поиск значения == | |||
=== №14. Есть ли среди введенных число k? === | |||
<source lang="pascal"> | |||
var n,k: integer; | |||
begin | |||
write('Введите целые числа n (n>0) и k: '); | |||
readln(n,k); | |||
assert(n>0); | |||
var Exists := false; | |||
for var i := 1 to n do | |||
begin | |||
write('Введите ', i, ' целое число: '); | |||
var x := ReadInteger; | |||
if x = k then | |||
begin | begin | ||
Exists := true; | |||
break; | |||
end; | end; | ||
end. | end; | ||
if Exists then | |||
writeln('Число ', k, ' было введено') | |||
else writeln('Число ', k, ' не было введено'); | |||
end. | |||
</source> | </source> | ||
=== №14b. Есть ли среди введенных число k? (то же с использованием while) === | |||
<source lang="pascal"> | |||
var n,k: integer; | |||
begin | |||
write('Введите целые числа n (n>0) и k: '); | |||
readln(n,k); | |||
assert(n>0); | |||
var Exists := false; | |||
var i := 1; | |||
while (i <= n) and not Exists do | |||
begin | |||
write('Введите ', i, ' целое число: '); | |||
var x := ReadInteger; | |||
i += 1; | |||
if x = k then | |||
Exists := true; | |||
end; | |||
if Exists then | |||
writeln('Число ', k, ' было введено') | |||
else writeln('Число ', k, ' не было введено'); | |||
end. | |||
</source> | |||
=== №15. Является ли число N>1 простым? === | |||
<source lang="pascal"> | <source lang="pascal"> | ||
begin | |||
write('Введите целое число N (N>1): '); | |||
var N := ReadInteger; | |||
assert(N>1); | |||
var IsPrime := True; | |||
for var i := 2 to round(sqrt(N)) do | |||
if N mod i = 0 then | |||
begin | begin | ||
IsPrime := False; | |||
break; | |||
end; | end; | ||
end. | |||
if IsPrime then | |||
writeln('Число ', N, ' является простым') | |||
else writeln('Число ', N, ' является составным'); | |||
end. | |||
</source> | </source> | ||
== Другие алгоритмы == | |||
=== №16. Разложение числа на простые множители === | |||
<source lang="pascal"> | |||
begin | |||
var x := ReadInteger('Введите целое число x (x>1): '); | |||
assert(x>1); | |||
var i := 2; | |||
write(x, ' = 1'); | |||
repeat | |||
if x mod i = 0 then | |||
begin | |||
Print('*', i); | |||
x := x div i; | |||
end | |||
else i += 1; | |||
until x = 1; | |||
end. | |||
</source> | |||
=== №17. Вычисление значения многочлена в точке x по схеме Горнера === | |||
<source lang="pascal"> | <source lang="pascal"> | ||
var | |||
x,a: real; | |||
n: integer; | |||
begin | begin | ||
write('Введите | write('Введите x: '); | ||
readln(x); | |||
write('Введите степень многочлена n (n>0): '); | |||
readln(n); | readln(n); | ||
assert(n>=0); | |||
write('Введите коэффициенты: '); | |||
readln(a); | |||
for var i := | |||
var s := a; | |||
for var i := 1 to n do | |||
begin | begin | ||
write('Введите a_{', i+1,'}: '); | |||
write( | readln(a); | ||
a | s := s*x + a; | ||
end; | end; | ||
writeln('Значение многочлена p(x) = a_{1}*x^n + a_{2}*x^(n-1) + ... + a_{n}*x + a_{n+1} в точке x = ', x, ' равно ', s); | |||
end. | end. | ||
</source> | </source> | ||
[ | === №18. Дана непрерывная на отрезке функция f(x), имеющая на отрезке ровно один корень. Найти его методом половинного деления === | ||
Дан отрезок [a,b] (f(a)*f(b)<=0) | |||
<source lang="pascal"> | |||
// В качестве примера взяты eps = 0.0001 и функция f(x) = sin(x) | |||
const eps = 0.0001; | |||
const f = sin; | |||
var a,b: real; | |||
begin | |||
write('Введите числа a и b (a<b): '); | |||
readln(a,b); | |||
assert(a<b); | |||
var fa := f(a); | |||
var fb := f(b); | |||
assert(fb*fa<0); | |||
while (b-a) > eps do | |||
begin | |||
var x := (b+a)/2; | |||
var fx := f(x); | |||
if fa*fx <= 0 then | |||
b := x; | |||
else | |||
begin | |||
a := x; | |||
fa := fx; | |||
end; | |||
end; | |||
writeln('Корень функции на [a,b] равен ',(b+a)/2); | |||
end.</source> | |||
---- | |||
© Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав |
Текущая версия от 23:18, 31 декабря 2019
Простейшие алгоритмы
№1. Сумма вводимых целых чисел
begin
var n := ReadInteger('Введите число слагаемых:');
var s := 0.0;
for var i:=1 to n do
begin
var x := ReadReal($'Введите слагаемое №{i}:');
s += x;
end;
Println($'Сумма равна {s}');
end.
В алгоритме используются интерполированные строки вида $'Сумма равна {s}'. Они начинаются с $. Выражение в фигурных скобках, расположенное в такой строке, заменяется на его значение.
№2. Произведение целых чисел
begin
var n := ReadInteger('Введите число множителей: ');
var p := 1.0;
for var i:=1 to n do
begin
var x := ReadReal('Введите множитель: ');
p *= x;
end;
Println($'Произведение равно {p}');
end.
№3. Двойной факториал n!!=n*(n-2)*(n-4)*...*2 (или 1)
begin
var x := ReadInteger('Введите x: ');
var p := 1;
while x>=2 do
begin
p *= x;
x -= 2;
end;
Println($'Двойной факториал равен {p}');
end.
№4. Сколько нечетных среди n введенных
begin
var n := ReadInteger('Введите n: ');
var c := 0;
for var i:=1 to n do
begin
var x := ReadInteger('Введите целое число: ');
if x mod 2 <> 0 then
c += 1;
end;
println($'Количество нечетных равно {c}');
end.
№5. Защита от неверного ввода
begin
var x: real;
repeat
x := ReadReal('Введите x>0: ');
if x<=0 then
Println('Неверный ввод');
until x>0;
end.
№6. Табулирование функции f(x) на отрезке в точках, разбивающих отрезок на N частей
Дан отрезок [a,b]
function f(x: real) := sin(x)*x;
begin
var N := ReadInteger('Введите N: ');
Assert(N>0);
var (a,b) := ReadReal2('Введите a и b: ');
var h := (b-a)/N;
var x := a;
loop N+1 do
begin
Writeln(x:5:2,f(x):10:4);
x += h;
end;
end.
№6a. Решение, использующее while. Погрешность округления и вычислительная погрешность
function f(x: real): real:= sin(x)*x;
begin
var N:=ReadInteger('Введите N: ');
Assert(N>0);
var (a,b):=ReadReal2('Введите a и b: ');
var h := (b-a)/N;
var x := a;
while x <= b+h/2 do
begin
writeln(x:5:2,f(x):10:4);
x += h;
end;
end.
Рекуррентные соотношения
№7. Вывод 10 первых степеней двойки
begin
var x := 2;
for var i := 1 to 10 do
begin
writeln(i:2,x:5);
x *= 2;
end;
end.
№8. Вывод всех двухзначных чисел, кратных 5
begin
var x := 10;
while x < 100 do
begin
writeln(x:3);
x += 5;
end;
end.
№9. Вывод n первых чисел Фибоначчи
begin
var n := ReadInteger('Введите целое число n (n > 1): ');
Assert(n>1);
var (a,b) := (1,1);
Print(a,b);
loop n-2 do
begin
(a,b):=(b,a+b);
Print(b);
end;
end.
В алгоритме используются кортежи. В момент переприсваивания в цикле создаются буферные переменные, что позволяет нам избежать их объявления вручную.
№10. Найти НОД(A,B), используя алгоритм Евклида:
НОД(A,B) = НОД(B,A mod B); НОД(A,0) = A
begin
var (a,b):=ReadInteger2('Введите целые числа A и B: ');
while b<>0 do
(A,B):=(B,A mod B);
println($'НОД(A,B) = {A}');
end.
№11. Найти сумму цифр целого числа m
begin
var m := ReadInteger('Введите целое число m: ');
var (s,m1) := (0,abs(m));
while m1 > 0 do
begin
s += m1 mod 10;
m1 := m1 div 10;
end;
println($'Сумма цифр числа {m} равна {s}');
end.
Для работы с отрицательными числами в алгоритме используется стандартная функция abs(x) возвращающая модуль от x.
Максимумы и минимумы
№12. Найти max из введенных чисел
begin
var n := ReadInteger('Введите целое число n (n>0): ');
assert(n>0);
var x := ReadReal('Введите 1 число: ');
var max := x;
for var i := 2 to n do
begin
x := ReadReal($'Введите {i} число: ');
if max < x then
max := x;
end;
Println($'Максимальное из введенных чисел: {max}');
end.
№12a. Найти min, удовлетворяющее условию p(x)
// Условие взятое как пример (Если число положительное, то условие p(x) возвращает true, иначе false)
function p(x: real): boolean:=x > 0;
begin
var n := ReadInteger('Введите целое число n (n>0): ');
assert(n>0);
var min := real.MaxValue;
for var i := 1 to n do
begin
var x := ReadReal($'Введите {i} число: ');
if (x < min) and p(x) then
min := x;
end;
if min = real.MaxValue then
println('Нет чисел, удовлетворяющих условию')
else println($'Минимальное из введенных чисел, удовлетворяющее условию: {min}');
end.
Суммирование рядов (конечных и бесконечных)
№13. Вычислить Σ(i=1..n) a^i/i!
begin
var a:=ReadReal('Введите a: ');
var n:=ReadInteger('Введите n (n>0): ');
assert(n>0);
var x := a;
var s := x;
for var i := 2 to n do
begin
x *= a / i;
s += x;
end;
Println($'Сумма = {s}');
end.
№13a. Вычислить Σ(i=1..∞) (-1)^i * a^i/i!
begin
var a:=ReadReal('Введите a (0 < a < 1): ');
assert((a>0) and (a<1));
var eps := 0.0001;
var i := 1;
var s := 0.0;
var y := -a;
repeat
s += y / i;
i += 1;
y *= -a;
until abs(y/i) < eps;
Println($'Сумма = {s}');
end.
Поиск значения
№14. Есть ли среди введенных число k?
var n,k: integer;
begin
write('Введите целые числа n (n>0) и k: ');
readln(n,k);
assert(n>0);
var Exists := false;
for var i := 1 to n do
begin
write('Введите ', i, ' целое число: ');
var x := ReadInteger;
if x = k then
begin
Exists := true;
break;
end;
end;
if Exists then
writeln('Число ', k, ' было введено')
else writeln('Число ', k, ' не было введено');
end.
№14b. Есть ли среди введенных число k? (то же с использованием while)
var n,k: integer;
begin
write('Введите целые числа n (n>0) и k: ');
readln(n,k);
assert(n>0);
var Exists := false;
var i := 1;
while (i <= n) and not Exists do
begin
write('Введите ', i, ' целое число: ');
var x := ReadInteger;
i += 1;
if x = k then
Exists := true;
end;
if Exists then
writeln('Число ', k, ' было введено')
else writeln('Число ', k, ' не было введено');
end.
№15. Является ли число N>1 простым?
begin
write('Введите целое число N (N>1): ');
var N := ReadInteger;
assert(N>1);
var IsPrime := True;
for var i := 2 to round(sqrt(N)) do
if N mod i = 0 then
begin
IsPrime := False;
break;
end;
if IsPrime then
writeln('Число ', N, ' является простым')
else writeln('Число ', N, ' является составным');
end.
Другие алгоритмы
№16. Разложение числа на простые множители
begin
var x := ReadInteger('Введите целое число x (x>1): ');
assert(x>1);
var i := 2;
write(x, ' = 1');
repeat
if x mod i = 0 then
begin
Print('*', i);
x := x div i;
end
else i += 1;
until x = 1;
end.
№17. Вычисление значения многочлена в точке x по схеме Горнера
var
x,a: real;
n: integer;
begin
write('Введите x: ');
readln(x);
write('Введите степень многочлена n (n>0): ');
readln(n);
assert(n>=0);
write('Введите коэффициенты: ');
readln(a);
var s := a;
for var i := 1 to n do
begin
write('Введите a_{', i+1,'}: ');
readln(a);
s := s*x + a;
end;
writeln('Значение многочлена p(x) = a_{1}*x^n + a_{2}*x^(n-1) + ... + a_{n}*x + a_{n+1} в точке x = ', x, ' равно ', s);
end.
№18. Дана непрерывная на отрезке функция f(x), имеющая на отрезке ровно один корень. Найти его методом половинного деления
Дан отрезок [a,b] (f(a)*f(b)<=0)
// В качестве примера взяты eps = 0.0001 и функция f(x) = sin(x)
const eps = 0.0001;
const f = sin;
var a,b: real;
begin
write('Введите числа a и b (a<b): ');
readln(a,b);
assert(a<b);
var fa := f(a);
var fb := f(b);
assert(fb*fa<0);
while (b-a) > eps do
begin
var x := (b+a)/2;
var fx := f(x);
if fa*fx <= 0 then
b := x;
else
begin
a := x;
fa := fx;
end;
end;
writeln('Корень функции на [a,b] равен ',(b+a)/2);
end.
© Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав