Числовые типы данных

Целочисленные типы

До сих пор рассматривались только один тип целочисленных переменных — int. На самом деле существует несколько основных целочисленных типов, тип int — лишь один (но наиболее часто используемый) из них.

Таблица основных целочисленных типов.

Название Размер Знаковый Синонимы
short 2 байта Знаковый short int, signed short, signed short int
unsigned short 2 байта Беззнаковый unsigned short int
int 4 байта Знаковый signed int
unsigned 4 байта Беззнаковый unsigned int
long 4 байта Знаковый long int, signed long, signed long int
unsigned long 4 байта Беззнаковый unsigned long int
long long 8 байт Знаковый long long int, signed long long, signed long long int
unsigned long long 8 байт Беззнаковый unsigned long long int

То есть типы бывают “короткими” (short), обычными, длинными (long) и очень длинными (long long). Последний тип является расширением компилятора GNU C++ и не является стандартным типом для языка C++, поэтому он может отсутствовать в других реализациях языка или называться по-другому (например, в компиляторе Microsoft Visual C++ аналогичный тип называется int64). Чем “длиннее” тип, тем большее число различных значений он может принимать, тем больше памяти он занимает. Также типы бывают знаковыми (signed), которые могут принимать как положительные, так и отрицательные значения и беззнаковые (unsigned), которые принимают только неотрицательные значения.

Таблица значений, которые могут принимать различные типы:

Название Размер Минимальное значение Максимальное значение
short 16 бит -215 =- 32768 215-1 = 32767
unsigned short 16 бит 0 216-1 = 65535
int, long 32 бита -231 = -2147483648 231-1 = 2147483647
unsigned, unsigned long 32 бита 0 232-1 = 4294967295
long long 64 бита -263 = -9223372036854775808 263-1 = 9223372036854775807
unsigned long long 64 бита 0 264-1 = 18446744073709551615

На самом деле в стандарте языка C++ не оговорены конкретные значения размеров типов. Оговорено только то, что одинаковые знаковые и беззнаковые типы имеют одинаковые размеры, и размер меньшего типа всегда не превосходит размера большего типа. Вот какие размеры могут быть у этих типов в зависимости от разрядности процессора компьютера:

Тип 16-битный процессор 32-битный процессор 64-битный процессор
short 2 байта 2 байта 2 байта
int 2 байта 4 байта 4 байта
long 4 байта 4 байта 8 байт
long long 8 байт 8 байт

Действительные типы

Действительные (вещественные) числа представляются в виде чисел с десятичной точкой (а не запятой, как принято при записи десятичный дробей в русский текстах). Для записи очень больших или очень маленьких по модулю чисел используется так называемая запись “с плавающей точкой” (также называемая “научная” запись). В этом случае число представляется в виде некоторой десятичной дроби, называемой мантиссой, умноженной на целочисленную степень десяти (порядок). Например, расстояние от Земли до Солнца равно 1.496·1011, а масса молекулы воды 2.99·10-23.

Числа с плавающей точкой в программах на языке C++, а также при вводы и выводе записавыются в виде мантиссы, затем пишется буква e, затем пишется порядок. Пробелы внутри этой записи не ставятся. Например, указанные выше константы можно записать в виде 1.496e11 и 2.99e-23. Перед самим числом также может стоять знак минус.

Для представления в памяти ЭВМ действительных чисел существует три типа:

Тип Точность Размер Количество знаков мантиссы Минимальное положительное значение Максимальное значение
float Одинарная 4 байта 7 1.4e-45 3.4e38
double Двойная 8 байт 15 5.0e-324 1.7e308
long double Расширенная 10 байт 19 1.9e-4951 1.1e4932

Операция деления

Для действительных чисел определены операции сложения, вычитания, умножения и деления.

При этом операция деления выполняется по-разному для переменных и констант целочисленного типа и для переменных и констант действительных типов. В первом случае деление производится нацело с отбрасыванием дробной части, во втором случае — деление производится точно и результатом является действительное число. Более точно, если делимое и делитель одновременно являются целочисленными константами или переменными целочисленных типов, то деление будет целочисленным, а если хотя бы одно из них  действительное, то деление будет действительным. Например:

cout << 10  / 3  << endl;
cout << 10. / 3  << endl;
cout << 10  / 3. << endl;
cout << 10. / 3. << endl;

выведет 3 в первой строке и 3.33333 в остальных строках.

Результат выполнения деления не зависит от того, какой переменной будет присвоен результат. Если написать double a = 10 / 3;, то переменная a будет равна 3, так как деление 10/3 будет целочисленным, независимо от того, чему будет присвоен результат.

Приведение типов

Иногда возникает необходимость привести выражение одного типа к такому же выражению другого типа. Например, если есть две переменные a и b типа int и требуется вычислить их частное (не целочисленное) и записать в переменную d типа double. Следующий код:

double d;
d = a / b

будет неверным, т.к. деление a / b будет целочисленным. Правильный код такой:

double d;
d = (double)a / b;

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

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

Упражнение

Определите, чему будут равны следующие переменные

int a = 13 / 5;
int b = 13 % 5;
int c = 13.0 / 5;
double d = 13 / 5;
double e = 13 % 5;
double f = 13.0 / 5;
double g = 13 / 5 + 2 / 5;
double h = 13.0 / 5 + 2.0 / 5;
int i = 13.0 / 5 + 2.0 / 5;

Список функций

В стандартную математическую библиотеку языка Си (а, значит, и C++) входит множество специальных математических функций, которые нужно знать и уметь использовать. Для того, чтобы использовать эти функции в своей программе, необходимо подключить заголовочный файл, содержащий описания этих функций, что делается строчкой в начале программы:

#include <cmath>

Функция от одного аргумента вызывается, например, так: sin(x). Вместо числа x может быть любое число, переменная или выражение. Функция возращает значение, которое можно вывести на экран, присвоить другой переменной или использовать в выражении:

y = sin(x);
cout << sqrt(2) << endl;
Функция Описание
Округление
round Округляет число по правилам арифметики, то есть round(1.5) == 2, round(-1.5) == -2
floor Округляет число вниз (“пол”), при этом floor(1.5) == 1, floor(-1.5) == -2
ceil Округляет число вверх (“потолок”), при этом ceil(1.5) == 2, ceil(-1.5) == -1
trunc Округление в сторону нуля (отбрасывание дробной части), при этом trunc(1.5) == 1, trunc(-1.5) == -1
fabs Модуль (абсолютная величина)
Корни, степени, логарифмы
sqrt Квадратный корень. Использование: sqrt(x)
cbrt Кубический корень. Использование: cbrt(x)
pow Возведение в степень, возвращает ab. Использование: pow(a,b)
exp Экспонента, возвращает ex. Использование: exp(x)
log Натуральный логарифм
log10 Десятичный логарифм
Тригонометрия
sin Синус угла, задаваемого в радианах
cos Косинус угла, задаваемого в радианах
tan Тангенс угла, задаваемого в радианах
asin Арксинус, возвращает значение в радианах
acos Арккосинус, возвращает значение в радианах
atan Арктангенс, возвращает значение в радианах

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

A: Целая часть

Дано положительное действительное число X. Выведите его целую часть.

Ввод Вывод
17.9
17

B: Дробная часть

Дано положительное действительное число X. Выведите его дробную часть.

Ввод Вывод
17.9
0.9

C: Первая цифра после точки

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

Ввод Вывод
1.79
7

D: Гипотенуза

Даны длины катетов прямоугольного треугольника. Выведите длину его гипотенузы.

Ввод Вывод
3 4
5

E: Площадь треугольника

Даны длины сторон треугольника. Вычислите площадь треугольника.

Ввод Вывод
3 4 5
6
1 1 1
0.433013

F: Часы - 1

С начала суток прошло \(H\) часов, \(M\) минут, \(S\) секунд (\(0\le H <12\), \(0\le M < 60\), \(0\le S < 60\)). По данным числам \(H\), \(M\), \(S\) определите угол (в градусах), на который повернулаcь часовая стрелка с начала суток и выведите его в виде действительного числа.

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

Ввод Вывод
1 2 6
31.05

G: Часы - 2

С начала суток часовая стрелка повернулась на угол в \(\alpha\) градусов. Определите на какой угол повернулась минутная стрелка с начала последнего часа. Входные и выходные данные — действительные числа.

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

Пример

Ввод Вывод
190
120

H: Часы - 3

С начала суток часовая стрелка повернулась на угол в \(\alpha\) градусов. Определите сколько полных часов, минут и секунд прошло с начала суток, то есть решите задачу, обратную задаче F. Запишите ответ в три целочисленные переменные и выведите их на экран.

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

Ввод Вывод
31.05
1 2 6

I: Проценты

Процентная ставка по вкладу составляет P процентов годовых, которые прибавляются к сумме вклада. Вклад составляет X рублей Y копеек. Определите размер вклада через год.

Программа получает на вход числа целые P, X, Y и должна вывести два числа: величину вклада через год в рублях и копейках. Копейки необходимо округлить до целого числа по правилам арифметики.

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

Ввод Вывод
12 179 0
200 48

J: Сложные проценты

Процентная ставка по вкладу составляет P процентов годовых, которые прибавляются к сумме вклада через год. Вклад составляет X рублей Y копеек. Определите размер вклада через K лет.

Программа получает на вход целые числа P, X, Y, K и должна вывести два числа: величину вклада через год в рублях и копейках. Копейки необходимо округлить до целого числа по правилам арифметики. Перерасчет суммы вклада (с округлением копеек) происходит ежегодно.

Ввод Вывод
12 179 0 5
315 46

K*: Цена товара

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

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

Если у вас не получается решить эту задачу, прочите примечание в конце листка.

Ввод Вывод
10.35
10 35

L: Квадратное уравнение - 1

Даны действительные коэффициенты \(a\), \(b\), \(c\), при этом \(a\ne0\). Решите квадратное уравнение \(ax^2+bx+c=0\) и выведите все его корни. Если уравнение имеет два корня, выведите два корня в порядке возрастания, если один корень — выведите одно число, если нет корней — не выводите ничего.

Ввод Вывод
1 -1 -2
-1 2

M: Квадратное уравнение - 2

Даны произвольные действительные коэффициенты \(a\), \(b\), \(c\). Решите уравнение \(ax^2+bx+c=0\).

Если данное уравнение не имеет корней, выведите число 0. Если уравнение имеет один корень, выведите число 1, а затем этот корень. Если уравнение имеет два корня, выведите число 2, а затем два корня в порядке возрастания. Если уравнение имеет бесконечно много корней, выведите число 3.

Тесты к этой задаче закрытые.

Ввод Вывод
1 -1 -2
2 -1 2
-1 2 -1
1 1

N: π2/6

По данному числу n вычислите сумму \(1+\frac{1}{2^2}+\frac{1}{3^2}+...+\frac{1}{n^2}\).

Решая эту задачу не забывайте, что 1/4==0, 1/9==0 и т.д.

Ввод Вывод
3
1.36111

Знаете ли вы, что этот ряд сходится к \(\pi^2/6\)?

O: ln 2

По данному числу n вычислите сумму \(1-\frac12+\frac13-\frac14++...+\frac{(-1)^{n+1}}{n}\).

Операцией возведения в степень пользоваться нельзя. Алгоритм должен иметь сложность O(n). Попробуйте также обойтись без использования инструкции if.

Ввод Вывод
3
0.833333

Этот ряд сходится к значению ln 2.

P: Геометрическая прогрессия

Забудьте формулу суммы геометрической прогрессии и вычислите сумму \(1+x+x^2+...+x^n\).

Программа получает на вход целое число n и действительное число x. Операцией возведения в степень пользоваться нельзя. Алгоритм должен иметь сложность O(n).

Ввод Вывод
4 0.1
1.1111

Q: Просто π

По данному числу n вычислите сумму \( 4\left(1-\frac13+\frac15-\frac17+...+\frac{(-1)^n}{2n+1}\right)\)

Операцией возведения в степень пользоваться нельзя. Алгоритм должен иметь сложность O(n).

Ввод Вывод
2
3.46667

Этот ряд сходится к числу \(\pi\).

R: Экспонента

По данному целому числу n и действительному числу x вычислите сумму \( 1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+...+\frac{x^n}{n!}\)

Операцией возведения в степень пользоваться нельзя. Алгоритм должен иметь сложность O(n).

Ввод Вывод
2 0.1
1.105
10 0
1
100 1
2.718282

Этот ряд сходится к \(e^x\) при росте \(n\).

S: Косинус

По данному целому числу n и действительному числу x вычислите сумму \( 1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+...+(-1)^n\frac{x^{2n}}{(2n)!}\)

Операцией возведения в степень пользоваться нельзя. Алгоритм должен иметь сложность O(n).

Ввод Вывод
2 0.1
0.995004
10 0
1
50 3.14159
-1

Этот ряд сходится к \(\cos x\) при росте \(n\) (углы измеряются в радианах).

T: Сумма с корнями

По данным натуральным числам n и a вычислите сумму \[ \sqrt{a + \sqrt{2a + ... + \sqrt{ (n-1)a + \sqrt{na}} } } \]

Ввод Вывод
3 2
2.13063

U: Схема Горнера

Дан многочлен \(P(x)=a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0\) и число \(x\). Вычислите значение этого многочлена, воспользовавшись схемой Горнера: \[ P(x)= \left( ... \left( \left( \left( a_n x + a_{n-1} \right) x + a_{n-2} \right) x + a_{n-3} \right) ... \right) x + a_{0} \]

Сначала программе подается на вход целое неотрицательное число \(n\le20\), затем действительное число \(x\), затем следует \(n+1\) вещественное число — коэффициенты многочлена от старшего к младшему. Программа должна вывести значение многочлена.

При решении этой задачи нелья использовать массивы и операцию возведения в степень. Программа должна иметь сложность O(n).

Ввод Вывод
1 0
1 1
1
2 0.5
1 1 1
1.75

V*: Система линейных уравнений - 1

Даны числа \(a\), \(b\), \(c\), \(d\), \(e\), \(f\). Известно, что система линейных уравнений \[ \cases{ax + by = e, \cr cx + dy = f.} \]

имеет ровно одно решение. Выведите два числа \(x\) и \(y\), являющиеся решением этой системы.

Ввод Вывод
1 0 0 1 3 3
3 3

W*: Первая цифра после точки

Попробуйте еще раз решить следующую задачу.

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

Если у вас не получается решить эту задачу, прочите примечание в конце листка.

Ввод Вывод
2.1
1

X*: Часы - 3

Вспомните задачу K и попробуйте еще раз решить следующую задачу.

С начала суток часовая стрелка повернулась на угол в \(\alpha\) градусов. Определите сколько полных часов, минут и секунд прошло с начала суток, то есть решите задачу, обратную задаче F. Запишите ответ в три целочисленные переменные и выведите их на экран.

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

Если у вас не получается решить эту задачу, прочите примечание в конце листка.

Ввод Вывод
31.025
1 2 3

Y**: Система линейных уравнений - 2

Даны числа \(a\), \(b\), \(c\), \(d\), \(e\), \(f\). Решите систему линейных уравнений \[ \cases{ax + by = e, \cr cx + dy = f.} \]

Вывод программы зависит от вида решения этой системы.

Если система не имеет решений, то программа должна вывести единственное число 0.

Если система имеет бесконечно много решений, каждое из которых имеет вид \(y=kx+b\), то программа должна вывести число 1, а затем значения \(k\) и \(b\).

Если система имеет единственное решение \((x_0,y_0)\), то программа должна вывести число 2, а затем значения \(x_0\) и \(y_0\).

Если система имеет бесконечно много решений вида \(x=x_0\), \(y\) — любое, то программа должна вывести число 3, а затем значение \(x_0\).

Если система имеет бесконечно много решений вида \(y=y_0\), \(x\) — любое, то программа должна вывести число 4, а затем значение \(y_0\).

Если любая пара чисел \((x,y)\) является решением, то программа должна вывести число 5.

Тесты к этой задаче закрытые.

Ввод Вывод
1 0 0 1 3 3
2 3 3
1 1 2 2 1 2
1 -1 1
0 2 0 4 1 2
4 0.5

Z**: Кубическое уравнение

Даны четыре действительных числа: \(A\), \(B\), \(C\), \(D\). Найдите все корни уравнения \(Ax^3+Bx^2+Cx+D=0\).

Известно, что все корни этого уравнения не превосходят по абсолютной величине 1000. Известно, что любые два корня этого уравнения различаются не менее, чем на 10-6.

Программа получает на вход четыре действительных числа: \(A\), \(B\), \(C\), \(D\). Любые из этих четырех чисел, но не все одновременно, могут быть равны 0.

Программа должна вывести от 0 до 3 действительных чисел: корни данного уравнения в порядке возрастания. Кратные корни должны быть выведены только один раз. Значения корней необходимо выводить с точностью до 6 знаков после точки.

Ввод Вывод
1 -2 1 0
0 1

Тесты к этой задаче закрытые.

Если у вас не получаются задачи...

Если вам не удается решить задачи K, W, X, то посмотрите на следующую программу:

#include<iostream>
using namespace std;

int main()
{
    double x, y;
    x = 4.1;
    y = 4.2;
    cout << x << endl;
    cout << y << endl;
    cout.precision(20);
    cout << x << endl;
    cout << y << endl;
    return 0;
}

Инструкция cout.precision(20) устанавливает количество значащих цифр при выводе действительных чисел. Откомпилируйте и запустите эту программу, подумайте над результатом ее работы. Подумайте, как это может сказаться на решении заданий K, W, X.