Вывести все простые числа, оканчивающиеся на 1 - Pascal ABC
Формулировка задачи:
Решение задачи: «Вывести все простые числа, оканчивающиеся на 1»
var i, k, n: integer;
sr: real;
f: file of integer;
p, b: boolean;
begin
randomize; {инициализация генератора псевдослучайных чисел}
assign(f, 'test.dat'); {связывание файловой переменной с файлом}
rewrite(f); {открыть (типизированный) файл для чтения-записи и стереть содержимое файла}
{-- Генерируем файл, заодно вычисляем среднее арифметическое --}
sr := 0;
for i := 1 to 250 do
begin
repeat
n := random(9851) + 150 {интервал чисел 150..10000}
until (5000 >= n) or (n <= 6350); {если 5000 < n > 6350, генерируем заново}
write(f, n); {пишем в файл}
sr := sr + n {находим сумму чисел}
end;
sr := sr / 250; {находим среднее арифметическое чисел}
{-- Вывести все данные на экран --}
reset(f); {установить указатель в начало файла}
writeln('Исходный файл:');
for i := 1 to 250 do
begin
read(f, n); {читаем из файла}
write(n:5) {выводим на экран}
end;
writeln;
{-- Вывести все простые числа, оканчивающиеся на 1 --}
reset(f); {установить указатель в начало файла}
p := false; {простые числа пока не найдены}
writeln('Простые числа, оканчивающиеся на 1:');
for i := 1 to 250 do
begin
read(f, n); {читаем из файла}
if n mod 10 = 1 {если число оканчивается на 1,}
then begin {то проверяем, простое ли оно}
for k := 3 to trunc(sqrt(n)) do {перебираем возможные делители}
begin
b := n mod k > 0; {если b = true, то не делится}
if not b then break {если на что-то разделилось, значит, число составное}
end;
if b {если простое,}
then begin {то}
write(n:5); {выводим число на экран}
p := true {помечаем, что простое число найдено}
end
end;
end;
if not p then write('Не найдены'); {если нужые числа не найдены, выводим сообщение}
writeln;
{-- Найти числа, отличающиеся от среднего арифметического более чем на 100 --}
reset(f); {установить указатель в начало файла}
p := false; {требуемые числа пока не найдены}
writeln('Среднее арифметическое чисел = ', sr:0:3);
writeln('Числа, отличающиеся от среднего арифметического более чем на 100:');
for i := 1 to 250 do
begin
read(f, n); {читаем из файла}
if abs(n - sr) > 100
then begin
write(n:5); {выводим число на экран}
p := true {помечаем, что требуемое число найдено}
end
end;
if not p then write('Не найдены'); {если нужые числа не найдены, выводим сообщение}
writeln;
close(f); {закрываем файл}
readln
end.
Объяснение кода листинга программы
var i, k, n: integer; sr: real; f: file of integer; p, b: boolean; begin randomize; assign(f, 'test.dat'); rewrite(f); // Генерируем файл и вычисляем среднее арифметическое sr := 0; for i := 1 to 250 do begin repeat n := random(9851) + 150; until (5000 >= n) or (n <= 6350); write(f, n); sr := sr + n; end; sr := sr / 250; // Выводим все данные на экран reset(f); writeln('Исходный файл:'); for i := 1 to 250 do begin read(f, n); write(n:5); end; writeln; // Выводим все простые числа, оканчивающиеся на 1 reset(f); p := false; writeln('Простые числа, оканчивающиеся на 1:'); for i := 1 to 250 do begin read(f, n); if n mod 10 = 1 then begin for k := 3 to trunc(sqrt(n)) do begin b := n mod k > 0; if not b then break; end; if b then begin write(n:5); p := true; end; end; end; if not p then write('Не найдены'); writeln; // Находим числа, отличающиеся от среднего арифметического более чем на 100 reset(f); p := false; writeln('Среднее арифметическое чисел = ', sr:0:3); writeln('Числа, отличающиеся от среднего арифметического более чем на 100:'); for i := 1 to 250 do begin read(f, n); if abs(n — sr) > 100 then begin write(n:5); p := true; end; end; if not p then write('Не найдены'); writeln; close(f); readln; end.