Еще одна интересная операция - остаток от деления a на b. — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Еще одна интересная операция - остаток от деления a на b.

2019-11-28 131
Еще одна интересная операция - остаток от деления a на b. 0.00 из 5.00 0 оценок
Заказать работу

Понятно, что остатком от деления 17 на 5 будет число 2:

17 mod 5 = 2,

а вот чему будет равен остаток от деления меньшего числа на большее, например, 46 mod 200? 

 

Оказывается, в этом случае, результатом операции будет число 46. Вот другие примеры:

  34 mod 125 = 34,

120 mod 6 = 0.

 

Интересно, что остаток от деления любого целого числа на 10 будет равен последней цифре этого числа:

 

543 mod 10 = 3, 45 mod 10 = 5, 7 mod 10 = 7.

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

 

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

 

При решении этой задачи, надо помнить, что компьютер не знает десятичной и позиционной формы записи чисел, так для него совершенно неизвестно, сколько в числе 342 сотен, десятков и единиц. Это известно нам, потому что с раннего возраста мы используем такую форму записи чисел. Мы условились считать, что на первом месте слева стоит цифра единиц, на втором - цифра десятков, на третьем - цифра сотен и т.д.

Компьютеру это неизвестно! Он любое число переводит на язык двух цифр -

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

Способ первый достаточно простой. Сущность которого в следующем.

Для определения цифры сотен делим данное число на 100 и остаток отбрасываем, т. е. выполняем целочисленное деление.

Для определения цифры десятков надо из данного числа вычесть сотни, результат разделить на 10 и остаток отбросить.

Для определения цифры единиц надо из данного числа вычесть сотни и десятки. Для записи числа теми же цифрами в обратном порядке, умножим цифру единиц на 100, сложим с цифрой десятков, умноженной на 10 и с цифрой сотен.

Далее из заданного числа вычитаем полученное новое. Например, для числа 342. Выполним целочисленное деление числа на 100, получим цифру сотен:

342 div 100 = 3;

вычитаем из 342 сотни 3*100 и результат делим на 10 - получим цифру десятков:

(342 - 3*100) div 10 = 4;

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

342 - 3*100 - 4*10 = 2.

Для записи числа в обратном порядке, умножаем цифру единиц 2 на 100 и складываем с цифрой десятков, умноженных на 10 (4*10) и прибавляем цифру сотен 3. Получим новое число, записанное теми же цифрами, но в обратном порядке:

2 100 + 4 10 + 3 = 243.

Вычитаем: 342 - 243 = 99.

 

Программа

Program Problem1;

uses Crt;

Var

  a, s, d, e, b, r: integer;

begin

  write('Введите трехзначное число '); readln(a);

  s:= a div 100;

  d:= (a - s*100) div 10;

  e:= a - s*100 - d*10;

  b:= e*100 + d*10 + s;

  r:= a - b;

  writeln('Искомая разность равна ', r)

End.

 

Программа достаточно проста и понятна.

В разделе описаний переменным a, s, d, e, b, r устанавливается целый тип - integer.

Вводится трехзначное число и присваивается переменной a.

Переменной s присваивается результат целочисленного деления введенного числа a на 100. Это значение есть цифра сотен. Переменная d получает значение цифры десятков:

d:= (a - s*100) div 10,

переменная e - это цифра единиц:

 

e:= a - s*100 - d*10.

Дальнейшая работа программы понятна.

 

Составим программу для первого примера на основе второгоспособа.

Он основан на применении двух операций с целыми числами - деления (div) и нахождения остатка от деления (mod).

Посмотрите на примере, в чём состоит математика этого способа.

Находим цифру единиц:   342 mod 10 = 2.

Делим заданное число на 10, при этом уже найденная цифра единиц " отбрасывается ":                                            342 div 10 = 34.

Находим цифру десятков:  34 mod 10 = 4.

Делим, оставшееся число 34 на 10, при этом цифра десятков "отбрасывается", а результатом будет цифра сотен:

34 div 10 = 3.

Дальнейшие операции такие же, как и в первом способе.

 

Программа

Program Problem;

uses Crt;

Var

   a, c, s, d, e, b, r: integer;

begin

    write('Введите трехзначное число '); readln(a);

    c:= a; {Запоминается первоначальное число}

    e:= a mod 10; (* Цифра единиц *)

    a:= a div 10;

    d:= a mod 10; (* Цифра десятков *)

    s:= a div 10; (* Цифра сотен *)

    b:= e*100 + d*10 + s;

    (* Число, записан. в обратном пор. *)

    r:= c - b; (* Разность чисел *)

    writeln('Искомая разность равна ', r)

 end.

Пример 2.

 

Пример 2. Определить и вывести на экран цифры целого числа n.

 

Разберем математику этого вопроса на частном примере.

 

Найдем цифры числа 4538. Для этого надо найти остаток от деления 4538 на 10 с помощью операции нахождения остатка от деления целых чисел (mod):

 4538 mod 10 = 8, получим последнюю цифру числа (она же является первой справа).

Выдаем сообщение: "1 - я цифра справа равна 8".

После этого выполним целочисленное деление заданного числа 4538 на 10, получим 453 (остаток отбрасывается):

4538 div 10 = 453.

Далее процесс повторяем:

                     2 - й раз;              453 mod 10 = 3

2 - я цифра справа равна 3,

                                              453 div 10 = 45,

            3 - й раз;                45 mod 10 = 5,

                                   3 - я цифра справа равна 5,

                                                45 div 10 = 4,

            4 - й раз;                4 mod 10 = 4,

                                   4 - я цифра справа равна 4,

                                                 4 div 10 = 0.

 

Обратите внимание! Процесс будет продолжаться пока число n не равно нулю. Как только оно станет равно нулю цикл   заканчивается.

 

В программе еще надо указывать какая по счету цифра в числе справа. Для этого надо завести еще одну переменную в качестве счетчика. Эта переменная каждый цикл должна увеличиваться на 1.

 

Программа

 

Program Problem2; {Опред. и вывод на экран цифр числа.}

uses Crt;

Var

  n, p, i: integer;

Begin

  write('Введите натуральное число n <= 32767 '); readln(n);

  i:= 1;

  while n <> 0 do

     begin

        p:= n mod 10;

        writeln(i, ' - я цифра справа равна ', p);

        n:= n div 10;

        i:= i + 1

     end

end.

Построение программы и ее работа.

 

В разделе описаний

Переменная n для целого числа, p - для цифр числа, i - счетчик цифр.

В разделе операторов

С помощью оператора write выводится на экран запрос для пользователя о вводе целого числа. Оператор readln заносит его значение в память и присваивает переменной n.

Счетчику i устанавливается первоначальное значение 1.

В операторе while записывается условие (пока n не равно 0), при котором цикл будет выполняться.

Так как в цикле несколько операторов, то используются операторные скобки

begin... end.

В них записаны операторы:

p:= n mod 10; - определяется последняя цифра;

writeln(i,' - я цифра справа равна ', p); - выводится на экран порядковый номер цифры справа и сама эта цифра;

n:= n div 10; - от числа " зачеркивается " последняя цифра;

i:= i + 1; - счетчик увеличивается на 1.

 

 

Пример 3.

Пример 3. Составить программу перестановки первой и последней цифр введенного натурального числа.

 

Математику этого вопроса разберем на частном примере.

Пусть пользователем введено число 4538. После перестановки первой и последней цифр число станет таким: 8534.

Определить последнюю цифру числа нетрудно. Это можно сделать уже известным нам способом: 4538 mod 10.

Чтобы найти и отделить первую цифру числа, надо использовать прием, который применялся в предыдущих программах для вывода цифр числа и для подсчета суммы цифр, т. е. отделять по одной цифре справа. Но, если в предыдущих программах такой процесс продолжался до тех пор пока n <> 0 (n не равнялось нулю), а когда n становилось равным нулю, то цикл заканчивался т. е. все цифры, включая первую, отделялись, то теперь надо этот процесс остановить на одну цифру раньше и тогда последним значением переменной n будет первая цифра числа.

В нашем примере она равна 4.

Итак, первая и последняя цифры найдены. Как переставить их в числе.

Для введенного нами числа это можно сделать так. Вычесть из него первую цифру, умноженную на 1000 и вычесть последнюю цифру:

4538 - 4 1000 - 8 = 530.

К полученному результату прибавить последнюю цифру - 8, умноженную на 1000 и прибавить первую цифру: 530 + 8 1000 + 4 = 8534.

Две последние операции можно записать в одной строке:

4538 - 4 1000 - 8 + 8 1000 + 4 = 8534.

Возникает одна трудность. Как определить разряд, в котором находится первая цифра числа (первая слева) и на сколько надо умножить ее при вычитании? Тысячи ли это, десятки тысяч или другой разряд?

Для того, чтобы это выяснять заведем переменную, первоначальное значение которой 1, а затем, каждый раз при отделении цифры она умножается на 10.

Посмотрим весь процесс на примере того же числа 4538.

Первоначальные значения: n = 4538, i = 1.

Цикл продолжается пока n  10, 4538  10 - истина, значит операторы цикла выполняются первый раз: i:= i*10 = 1*10 = 10; - переменная i получает первое значение,

n:= 4538 div 10 = 453.

Проверка условия: 453  10 - условие выполняется, значит цикл выполняется второй раз: i:= i*10 = 10*10 = 100; n:= 453 div 10 = 45.

Проверка условия: 45  10 - истина, значит цикл выполняется третий раз:

i:= i*10 = 100*10 = 1000, n:= 45 div = 4.

Проверка условия: 4>=10 - ложь, значит операторы цикла не выполняются. Цикл заканчивается.

Конечные значения переменных: n = 4 - первая цифра числа, i = 1000. Теперь остается выполнить сам процесс перестановки цифр и выдать результат на экран.

 

Программа

 

Program Problem3; { Перест. первой и последней цифр числа }

uses Crt;

Var

  n, n1, p, a, i: integer;

Begin

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

a:= n; i:= 1;

p:= n mod 10; {последняя цифра введенного числа}

while n >= 10 do

     begin

        i:= i*10;

        n:= n div 10;

     end;

n1:= a - n*i - p + n + p*i;

writeln('Число после перестановки цифр ', n1);

end.

 

Пример 4.

Пример 4. Составить программу разложения натурального числа n на простые множители.

 

Прежде вспомним, что к простым числам относятся все те натуральные числа, которые имеют только два делителя - единицу и само себя.

Натуральные числа, имеющие более двух делителей называются составными.

 

Единица имеет только один делитель - само себя и поэтому она не может относится ни к простым, ни к составным числам. Если выписать простые числа в порядке их возрастания, начиная от самого меньшего - 2, то получим следующий ряд чисел:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29,...

А теперь вспомним, как в младших классах мы раскладывали натуральные числа на простые множители.

Для этого берем первое простое число - 2 и пробуем делить данное натуральное число на 2, если число делится на 2, тогда надо 2 записать, а число разделить на 2 и снова полученный результат пробуем делить на два, если делится, тогда повторяем процесс деления, если не делится, тогда пробовать делить на следующее простое число - 3 и так далее.

Обычно такой процесс мы записывали " столбиком ":

Например:                                       или

                             

Таким образом, число 360 можно разложить на следующие простые множители: 360 = 2 2 2 3 3 5.

Самый простой алгоритм для составления программы может быть таким.

Алгоритм

В качестве первого делителя взять 2, присвоить это значение некоторой переменной i;

начать цикл " пока i <= n";

если данное число n делится на i, тогда выдать на экран значение i и разделив данное число на i, присвоить новое значение той же переменной n (n:= n div i);

далее цикл продолжить, но значение i не увеличивать на 1, а проверить деление нового значения n на прежнее значение i;

если n не делится на i, тогда i увеличить на 1 (i:= i + 1) и продолжить цикл, т.е. выполнить проверку условия цикла (i <= n), а затем снова проверить деление n на уже новое значение i.

Обратите внимание, что при таком алгоритме в качестве делителей уже не попадут составные числа. Объясните почему?

Программа

 

Program Problem4; { Разлож. числа на прост. множит.. 1- й спос. }

uses Crt;

Var

  n, i: integer;

Begin

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

  write('Простые делители числа ', n, ' следующие; ');

  i:= 2;

  while i <= n do

      if n mod i =0 then

                                begin

                                  write(i, ' ');

                                  n:= n div i

                                end

                             else i:= i + 1

End.

 

Пример 5.

 

Пример 5. Написать программу, в результате выполнения которой выяснится, входит ли цифра 2 в запись данного целого числа n.

 

Идея составления программы проста. Надо организовать цикл, в котором выделять цифры числа уже известным вам способом и каждую из них сравнивать с цифрой 2. Если цифра числа оказывается равной двум, тогда надо счетчик, которым может быть некоторая числовая переменная, увеличивать на единицу, иначе, цикл надо продолжать.

Когда цикл будет выполнен полностью, т. е. все цифры числа проверены и каждая из них будет сравнена с цифрой 2, надо снова использовать условный оператор и сравнить значение переменной - счетчика с нулем. Если значение переменной равно нулю, то это значит, что цифра 2 не входит в запись числа, иначе - входит.

 

АЛГОРИТМ

 

1. Начало. Переменные целого типа n, p, k: n - для вводимого числа; p - для цифр этого числа; k - счетчик, подсчитывающий количество цифр в числе, равных 2.

2. Ввод целого числа.

Счетчику k устанавливается первоначальное значение 0.

3. Цикл, пока n <> 0. В цикле, переменной p присваивать значение цифры числа.

Если p = 2, тогда увеличивать k на единицу.

Вычесть из числа n последнюю цифру и разделить его на 10.

Продолжить и закончить цикл.

4. Если k = 0, тогда выдать сообщение: "Цифра 2 не входит в запись числа", иначе, выдать сообщение: "Цифра 2 входит в запись числа".

5. Конец.  

Программа

 

Program Problem5; { Входит ли цифра 2 в запись числа }

uses Crt;

Var

  n, p, k: integer;

Begin

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

  k:= 0;

  while n <> 0 do

     begin

        p:= n mod 10;

           if p = 2 then k:= k + 1;

        n:= n div 10

     end;           

      if k = 0 then writeln('Цифра 2 не входит в запись этого числа')

                     else writeln('Цифра 2 входит в запись этого числа')

end.

 

Если вы внимательно разобрались в работе программы, то могли заметить, что во многих случаях в программе будет проделываться бесполезная работа.

Например, если нами введено число 31572. В программе сделано так, что отделяется по одной цифре справа и так продолжается до первой цифры слева.

Первой цифрой справа является 2. Казалось бы, раз в числе сразу первой цифрой найдена двойка, то можно выдать сообщение, что число содержит цифру 2 и на этом работу закончить. Однако в программе сделано не так. Цикл будет продолжаться до последней цифры числа и большая работа будет проделываться бесполезно.

Возникает необходимость в досрочном прерывании цикла.

 

Пример 6.

Пример 6. Составить программу вывода всех натуральных чисел, меньших n, квадрат суммы цифр которых равен заданному числу m.

 

Сущность задачи такова. Вводится натуральное число, до которого надо выводить все натуральные числа, удовлетворяющие заданному условию. Пусть, например, пользователь введет число - 21.

Второе число, которое надо ввести пользователю - это число, которому равен квадрат суммы цифр натуральных чисел.

Понятно, что это число должно быть точным квадратом, оно может быть: 4, 9, 16, 25, 36 и т.д.

Допустим, что пользователь ввел число 4.

Надо найти все натуральные числа от 1 до 21, квадрат суммы цифр которых равна 4. Начинаем из чисел: 1, 2, 3, 4, 5,..., 21, выбирать те, которые удовлетворяют заданному условию.

Первое из них - 2, так как 22 = 4, второе - 11, так как (1 + 1)2 = 22 = 4, третье - 20, так как (2 + 0)2 = 22 = 4.

Других натуральных чисел до 21, удовлетворяющих такому условию нет.

Все отобранные числа надо вывести на экран, т. е. 2, 11 и 20.

Алгоритм

 

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 Problem6;

uses Crt;

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.

 

В программе два цикла. Один - внешний, для натуральных чисел, второй - внутренний, для подсчета суммы цифр числа.

 

Упражнения


Поделиться с друзьями:

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.166 с.