Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практика Алгоритмические языки.doc
Скачиваний:
11
Добавлен:
14.02.2015
Размер:
360.45 Кб
Скачать

Алгоритм

1. Раздел описаний.

Переменные: n, m, k, a, p, s. Тип целый.

n - для границы значений натуральных чисел, m - для числа, с которым сравнивается квадрат суммы цифр (точный квадрат), k - для натуральных чисел от 1 до n, a - для запоминания натурального числа, перед тем, как будет определяться сумма его цифр, p - для цифр числа, s - для суммы цифр.

2. Раздел операторов.

Ввод значений n и m. Установить первоначальное значение для k (эта переменная "перебирает" все натуральные числа от 1 до n, k := 1).

Цикл, пока k <= n.

В цикле: установить первоначальные значения для суммы s (s:=0); запомнить число в переменную a (a := k).

Цикл для подсчета суммы цифр, пока k <> 0.

В цикле: выделять по одной цифре числа, известным способом; прибавлять по одной цифре к сумме; уменьшать число на последнюю цифру и на порядок.

Закончить цикл для подсчета суммы цифр.

Проверка выполнения условия.

Если квадрат суммы цифр равен заданному числу,

тогда вывести это натуральное число на экран.

Перейти к проверке следующего числа.

Закончить основной цикл проверки чисел.

3. Закончить программу.

По этому алгоритму составим программу.

Program Problem5;

var

n, m, k, a, p, s : integer;

begin

write('Введите натуральное число, до которого ');

write('выводить искомые числа '); readln(n);

writeln('Введите число, с которым сравниваете квадрат');

write('его суммы цифр. Оно должно быть точн. квадрат. '); readln(m);

write('Искомые числа: ');

k := 1;

while k <= n do

begin

s := 0; a := k;

while k <> 0 do

begin

p := k mod 10;

s := s + p;

k := k div 10

end;

if sqr(s) = m then write(a, ' ');

k := a + 1

end

end.

Пример 10. Найти наименьшее натуральное число, дающее при делении на 2, 3, 4, 5, 6 соответственно остатки 1, 2, 3, 4, 5.

Задачу будем решать так: берется наименьшее натуральное число - единица и находятся остатки от деления его на 2, 3, 4, 5 и 6; если остатки будут равны 1, 2, 3, 4 и 5, тогда это число является искомым, его надо выдать на экран и закончить программу, в противном случае, надо брать следующее натуральное число - 2 и проверять его, и так далее.

Программа, составленная по этой идее, очень проста:

Program Problem1;

var

n : integer;

begin

n := 0;

repeat

n := n + 1;

until (n mod 2 = 1) and (n mod 3 = 2) and (n mod 4 = 3) and

(n mod 5 = 4) and (n mod 6 = 5);

writeln('Искомое целое число ', n)

end.

Пример 11. Числа, одинаково читающиеся и слева направо, и справа налево, называются палиндромами. Например, числа 42324 или 1331 - палиндромы. Составьте программу, которая будет находить числа - палиндромы из заданного промежутка.

Логика составления программы такова.

Переставить цифры в числе и сравнить полученное число с заданным.

Раньше уже составлялась программа перестановки цифр числа, которая была выполнена с помощью цикла с предусловием

while ... do ...

Как будет построена часть программы о перестановки цифр с помощью цикла

repeat ... until ...

Пусть заданное число a, тогда введем еще одну переменную b, которой будет присвоено значение переменной a (для чего это делается вы узнаете позже): b := a;

Заведем еще одну переменную a1 для нового числа, в котором цифры уже будут переставлены.

Первоначальное значение этой переменной - ноль: a1 := 0;

Почему значение этой переменной равно нулю станет ясно из программы.

Далее организуем цикл repeat, в котором будет происходить перестановка цифр числа b:

repeat

a1 := a1*10 + b mod 10;

b := b div 10

until b = 0;

Итак, в цикле, также как и в цикле while ... do ..., отделяется последняя цифра:

b mod 10; (например, 343 mod 10 = 3); переменной a1 присваивается значение:

a1 := a1*10 + b mod 10; 0 * 10 + 3 =3;

"отбрасывается" последняя цифра заданного числа с помощью операции целочисленного деления:

b := b div 10; 343 div 10 = 34;

проверяется условие: b = 0, 34 = 0, условие не выполняется, значит цикл продолжается.

Отделяется последняя цифра уже нового числа:

b mod 10 = 34 mod 10;

новое число a1, уже равное 3, умножается на 10 и к результату прибавляется следующая цифра - 4:

a1 := a1*10 + b mod 10;

"отбрасывается" последняя цифра числа b:

b := b div 10 ; 34 div 10 = 3;

проверяется условие: b = 0, 3 = 0; условие не выполняется, значит цикл продолжается.

Отделяется последняя цифра числа:

b mod 10 ; 3 mod 10 = 3;

формируется новое число:

a1 := a1*10 + b mod 10 ; 34 * 10 + 3 = 343;

"отбрасывается" последняя цифра числа и получается новое число:

b := b div 10 ; 3 div 10 = 0;

проверяется условие: b = 0, 0 = 0; условие выполняется, значит цикл заканчивается.

Теперь становится ясно, почему введена другая переменная b для заданного числа, ее значение в цикле меняется от начального до нуля и, чтобы сохранить заданное число в переменной a, и вводится, так сказать, "рабочая" переменная - b.

После окончания цикла перестановки цифр числа, сравнивается первоначальное число, которое "сохранилось" в переменной a и число, которое получилось после перестановки цифр и "накопилось" в переменной a1.

Если a = a1, тогда значение a выдается на экран, так как это число является палиндромом.

Далее, значение a увеличивается на 1, т. е. берется для рассмотрения следующее по порядку натуральное число и снова продолжается внешний цикл. Цифры числа переставляются, полученное новое число после перестановки цифр - a1, сравнивается с первоначальным a и так далее.

Внешний цикл заканчивается, когда значение a становится равным правой границе интервала - n.