Часть полного текста документа:"Длинная" арифметика Известно, что арифметические действия, выполняемые компьютером в ограниченном числе разрядов, не всегда позволяют получить точный результат. Более того, мы ограничены размером (величиной) чисел, с которыми можем работать. А если нам необходимо выполнить арифметические действия над очень большими числами, например, 30! = 265252859812191058636308480000000? В таких случаях мы сами должны позаботиться о представлении чисел в машине и о точном выполнении арифметических операций над ними. Числа, для представления которых в стандартных компьютерных типах данных не хватает количества двоичных разрядов, называются "длинными". Реализация арифметических операций над такими "длинными" числами получила название "длинной арифметики". Организация работы с "длинными" числами во многом зависит от того, как мы представим в компьютере эти числа. "Длинное" число можно записать, например, с помощью массива десятичных цифр, количество элементов в таком массиве равно количеству значащих цифр в "длинном" числе. Но если мы будем реализовывать арифметические операции над этим числом, то размер массива должен быть достаточным, чтобы разместить в нем и результат, например, умножения. Существуют и другие представления "длинных" чисел. Рассмотрим одно из них. Представим наше число 30! = 265252859812191058636308480000000 в виде: 30! = 2 * (104)8 + 6525 * (104)7 + 2859 * (104) + 8121 * (104)5 + 9105 * (104)4 + 8636 * (104)3 + 3084 * (104)2 + 8000 * (104)1 + 0000 * (104)0. Это представление наталкивает на мысль о массиве, представленном в табл. 1. Таблица 1 Номер элемента в массиве А 0 1 2 3 4 5 6 7 8 9 Значение 9 0 8000 3084 8636 9105 8121 2859 6525 2 Мы можем считать, что наше "длинное" число представлено в 10000-10 системе счисления (десятитысячно-десятичная система счисления, приведите аналогию с восьмерично-десятичной системой счисления), а "цифрами" числа являются четырехзначные числа. Возникают вопросы. Что за 9 в А [0], почему число хранится "задом наперед"? Ответы очевидны, но подождем с преждевременными объяснениями. Ответы на вопросы будут ясны из текста. Примечание. Мы работаем с положительными числами! Первая задача. Ввести "длинное" число из файла. Решение задачи начнем с описания данных. Const MaxDig = 1000; {Максимальное количество цифр - четырехзначных!} Osn = 10000; {Основание нашей системы счисления, в элементах массива храним четырехзначные числа} Type Tlong = Array[0..MaxDig] Of Integer; {Максимальное количество десятичных цифр в нашем числе} Алгоритм ввода "длинного" числа из файла рассмотрим на конкретном примере. Пусть в файле записано число 23851674 и основанием (Osn) является 1000 (храним по три цифры в элементе массива А). Изменение значений элементов массива А в процессе ввода (посимвольного в переменную Ch) отражено в табл. 2. Таблица 2 А[0] А[1] А[2] А[3] Ch Примечание 3 674 851 23 - Конечное состояние 0 0 0 0 2 Начальное состояние 1 2 0 0 3 1-й шаг 1 23 0 0 8 2-й шаг 1 238 0 0 5 3-й шаг 2 385 2 0 1 4-й шаг: старшая цифра элемента А [1] перешла в пока "пустой" элемент А[2] 2 851 23 0 6 5-й шаг 2 516 238 0 7 6-й шаг 3 167 385 2 4 7-й шаг 3 674 851 23 Проанализируем таблицу (и получим ответы на поставленные выше вопросы). ............ |