Паскаль. Основы программирования


Разные задачи - часть 2


Например, если n = 30, то достаточно найти делители 1, 2, 3, 5 (натуральный квадратный корень из 30 равен 5), а все прочие делители получаются делением на найденные:

30 div 1 = 30;

30 div 2 = 15;

30 div 3 = 10;

30 div 5 = 6.

При составлении программы возникает проблема - нет встроенной функции извлечения квадратного корня в множестве целых чисел. Это препятствие легко обойти, если организовать цикл для выбора делителей d от 1 до тех пор пока

d*d<n (что является тем же, что и

< n), а если корень квадратный извлекается нацело, тогда этот случай надо рассмотреть отдельно после завершения основного цикла.

Почему надо сделать именно так. Это становится понятным на примере для числа 36.

= 6, цикл - пока d
d < 6;

d = 1, d

d = 1
1 = 1 < 36 (истина),

цикл продолжается;

находится остаток от деления 36 mod 1 = 0; выдается 1 и частное от деления 36 на 1, 36 div 1 =36;

d = 2, d

d = 2
2 = 4 < 36 (истина),

цикл продолжается;

36 mod 2 = 0;

выдается 2 и частное от деления 36 на 2, 36 div 2 = 18;

d = 3, d

d = 3
3 = 9 < 36 (истина),

цикл продолжается;

36 mod 3 = 0;

выдается 3 и частное от деления 36 на 3, 36 div 3 = 12;

d = 4, d

d = 4
4 = 16 < 36 (истина),

цикл продолжается;

36 mod 4 =0;

выдается 4 и 36 div 4 = 9;

d = 5, d

d = 5
5 = 25 < 36 (истина),

цикл продолжается;

36 mod 5 <>0, ничего не выдается на экран,

цикл продолжается;

d = 6, d

d = 6
6 = 36 < 36 (ложь), цикл заканчивается.

Проверяется d = 6 (d

d = n), 6
6 = 36 (истина), выдается 6.

Если бы цикл продолжался, пока d

d <= n, тогда при d = 6 на экран выдавалось бы - 6 и 36 div 6 = 6, т. е. две шестерки, что было бы ошибкой.


Программа

Program

Problem1a;    { Делители числа. 2 - способ }

    uses WinCrt;

    var

       n, d : integer;

    begin

       write('Введите целое число '); readln(n);

       writeln('Делители числа ', n);

         d := 1;

         while d*d < n do

             begin

                if n mod d=0 then write(d, ' ', n div d, ' ');

                d := d + 1

             end;

         if d*d = n then write(d);  writeln

    end.




Начало  Назад  Вперед



Книжный магазин