Работа с целыми числами

Операции DIV и MOD

Целочисленное деление div (от лат. division, деление) отличается от обычной операции деления тем, что возвращает целую часть частного, а дробная часть отбрасывается:

11 div 3 = 3
11 div 5 = 2
15 div 9 = 1
 2 div 3 = 0
85 div 10 = 8

Взятие остатка от деления mod (от modulus) вычисляет остаток от деления, полученный при выполнении целочисленного деления:

11 mod 3 = 2
11 mod 5 = 1
15 mod 9 = 6
 2 mod 3 = 2
85 mod 10 = 5

Аргументы операций div и mod — целые числа.

Преобразование типа

В арифметических операциях с вещественными числами можно использовать целые числа, но результат будет — вещественное число. Происходит автоматическое преобразование типа. Но переменой целого типа нельзя возвращать результат вычисления выражения с вещественным числом! Обратное преобразование в Pascal невозможно. Некоторые стандартные функции, вне зависимости от типа входящего аргумента, возвращают вещественный тип (sqrt, exp, ln, sin, cos, arctan). А функции abs и sqr возвращают целое число, если входящий аргумент целое и вещественное число, если аргумент вещественное число (http://wiki.freepascal.org/Standard_Functions). Для преобразования вещественного числа в целое существуют две функции:

  • trunc — отбрасывает дробную часть;
  • round — округляет до ближайшего целого

Если в выражениях используются разные целочисленные типы (например, byte, word, shortint и т. п.), то результат выражения приводится к тому типу, который включает соответствующий тип меньшего размера. Т. е. word + byte => word, smallint + integer => integer, а word + smallint => integer. Покажем это на следующем примере:

uses
	crt;
const
	a:shortint = 10;
	b:word = 10;
begin
	clrscr;
	writeln(sizeof(a));
	writeln(sizeof(b));
	writeln(sizeof(a+b));	
end.

В программе используется функция sizeof(). Эта функция возвращает размер памяти в байтах, занимаемого аргументом (переменная, тип). Вывод программы:

1
2
4

Что это значит? Предварительно описаны две типизированные константы разных типов: знаковый shortint, размером 1 байт, и word беззнаковый, размером 2 байта, но операция сложения приведет к образованию типа размером 4 байта, соответствующий во freepascal типу integer.

Задача 1
Дано двузначное число получить сумму и произведение его цифр.

uses
	crt;
var
	n:shortint;
	a,b:shortint; {разряды числа}
begin
	clrscr;
	write('n = '); readln(n);
	a := n mod 10;
	b := n div 10;
	writeln('a + b =', a + b);
	writeln('a * b =', a * b);
end.

Задача 2
Дано трехзначное число. Вывести иное трехзначное число, образованное из исходного, путем прочтения справа налево (вводится 123, выводится 321).

uses
	crt;
var
	n:integer;
	a,b,c:integer; {разряды числа}
begin
	clrscr;
	write('n = '); readln(n);
	a := (n mod 10) * 100;
	b := ((n mod 100) div 10) * 10;
	c := n div 100;
	writeln(a + b + c);
end.

Задача 3
Дни недели пронумерованы следующим образом: 0 — воскресенье, 1 — понедельник, 2 — вторник, …, 6 — суббота. Дано целое число K, лежащее в диапазоне 1–365. Определить номер дня недели для K-го дня года, если известно, что в этом году 1 января было понедельником.

uses
	crt;
var
	day,k:integer;
begin
	clrscr;
	write('k = '); readln(k);
	day := k - (k div 7) * 7;
	writeln(day);
end.

Добавить комментарий