Pascal. Целочисленное деление и остаток


В модуле "Арифметические выражения" мы говорили про особенности операции деления на языке Pascal.
Вспомним, что для целочисленных данных (тип integer) можно использовать три операции деления:
- обычное деление, возвращает значение типа real
div - целочисленное деление, когда у нас отбрасывается дробная часть в результате выполнения операции деления
mod - вычисления остатка от деления

ЗАПОМНИМ!
В языке Pascal результат деления целого числа на целое – это всегда вещественное число.

Пример:
var a, b, d, e: integer;
    c: real;
a := 10;
b := 3;
c := a / b;   // Ответ: с = 3.33333333333333E+000
d := a mod b;    // Ответ: d = 1
e := a div b;  // Ответ: e = 3

Эти операции очень важны в программировании. Их нужно понимать и правильно использовать. А для этого нужна практика!

 

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

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

Самый трудный вопрос, который возникает у начинающих - как же взять и получить у числа его цифры.
На самом же деле, все решается достаточно просто, если вспомнить математику. А математика нам говорит, что любое число можно разложить на сумму разрядных слагаемых.
Например: 365=3*100+6*10+5*1 . Мы видим, что каждая цифра это множитель у соответствующего разряда числа. 
Покажем, как получить каждую цифру числа в отдельную переменную, на примере деления столбиков на число 10. (число 10 мы берем, т.к. у нас десятичная система счисления и соответственно разрядные слагаемые у нас 1, 10, 100 и т.д.)
  

Проанализировав рисунок можно увидеть, что 
e := n mod 10;        // операция n mod 10   - вычисляет последнюю цифру числа n (то есть единицы числа)  365 mod 10 = 5 

d := n div 10 mod 10;   // операция n div 10 - сокращает число в 10 раз, то есть отбрасывает у числа последнюю цифру (365 div 10 = 36), 
                   // теперь мы можем вычислить число десятков, применив к результату знакомую операцию - вычислить остаток от деления на число 10, 36 mod 10 = 6
 
s := n div 100;       // чтобы получить сотни, достаточно у числа отбросить справа две цифры, то есть дважды разделить на 10  (n div 10 div10 или тоже самое, что n div 100) 365 div 100 = 3

Имея сохраненные цифры числа, мы можем составить из них любое число, умножая нужную цифру на соответсвующий разряд: 
например, строка ниже получит из исходного числа n новое число, у которого переставлены сотни и единицы:
1) старое число единиц (сохраненные в переменной e)  умножаем на 100 
2) старое число десятков (сохраненные в переменной d)  умножаем на 10 
3) старое число сотен мы может умножить просто на 1, или просто взять значение, сохраненное в переменной s
Затем значения из пунктов 1, 2 и 3 просто сложить и получим новое число:

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

Целиком программа будет выглядеть следующим образом:
var n, e, d, s: integer;

begin
  read(n);
  e := n mod 10;     
  d := n div 10 mod 10;  
  s := n div 100;
  writeln(e, ' ', d, ' ', s, ' ', e * 100 + d * 10 + s);
end.