Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 17.09.2013
Сообщений: 142
1

Длиные числа

03.12.2013, 10:59. Показов 3212. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Одним из недостатков предопределенных целых типов является ограниченный диапазон их значений ("всего" 10 десятичных разрядов для Longint). В некоторых прикладных задачах (например криптографии, задачах бухгалтерии) диапазона предопределенных целых типов не хватает. В этом случае прибегают к программной эмуляции работы с "длинными" целыми числами. Методы программной организации хранения и обработки чисел, выходящих за диапазон стандартных типов, называются длинной арифметикой.

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

Основные операции обработки длинных чисел (ввод, вывод, сравнение, сложение, умножение, деление и нахождение остатка от деления) реализуются в виде подпрограмм. Идея реализации указанных операций обычно мало чем отличаются от алгоритмов обработки целых чисел, которым научили в младшей школе на уроках математики: поразрядное сравнение, поразрядное сложение с переносом, поразрядное вычитание с заимствованием и т.д.

В данной работе предлагается реализовать некоторые операции обработки длинных неотрицательных целых чисел.
Что нужно:
1. Выберите для представления длинных чисел подходящий тип (массив или строку). Помните, каждая из указанных структур имеют преимущества и недостатки, которые будут влиять на реализацию алгоритмов обработки целых чисел в дальнейшем.
2. Объявите псевдоним TLong для представления типа целых чисел с числом разрядов не менее 255. В комментарии укажите, в каком порядке будут располагаться разряды длинного числа в вашем типе (в младших элементах - младшие разряды, или в младших элементах - старшие разряды).
3. Опишите процедуру инициализации переменной типа TLong: процедура должна иметь два параметра, один из которых - переменная для инициализации TLong, второй - строковое значение, которое содержит "естественную" запись длинного числа в виде последовательности цифр. Помните, что при использовании массива, следует обнулять его элементы, соответсвующие старшим разрядам длинного числа.
4. Опишите процедуру, которая выводит заданное длинное число на экран в "естественном" порядке.
5. Опишите процедуру, которая осуществляет вычитание двух длинных чисел (всегда - из большего меньшее). Подсказка: можно попробовать (не обязательно) использовать рекурсию - поразрядное вычитание повторяющаяся регулярная операция. Не забудьте возможность заема из старших разрядов.
6. Напишите программу, которая находит целую часть и остаток от деления одного длинного числа на другое. Исходные числа хранятся в текстовом файле.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2013, 10:59
Ответы с готовыми решениями:

длиные строки
как в делфи включить поддержка длиных строк (более 256 символ)

SetCurrentDirectoryW и длиные пути
Доброго. Согласно описанию мелкомягких SetCurrentDirectoryW поддерживает обработку путей более...

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

Даны натуральные числа M, N. Поменять одну из цифр первого числа с цифрой второго числа, чтобы получившиеся числа были взаимно простыми
Даны натуральные числа M, N. Поменять одну из цифр первого числа с цифрой второго числа, чтобы...

1
585 / 488 / 371
Регистрация: 05.11.2013
Сообщений: 1,265
Записей в блоге: 6
03.12.2013, 12:27 2
Лучший ответ Сообщение было отмечено makaroshka как решение

Решение

Фигасе заявочки. С таким во фриланс, мне кажется
Вот могу дать прогу для "школьного" умножения длинных чисел, вроде работала, када в школе учился
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
{       Умножение целых произвольной длины
}
const maxlen=100;
 
procedure AddTo (var nr:integer; var r:string; ns:integer; var s:string;
                 sdvig:integer);
          {К строке r текущей длиной nr добавляет строку s длиной ns
           со сдвигом sdvig}
var i,cur,ost,re,c:integer;
begin
     cur:=nr-sdvig;     {Позиция в строке r, с которой начинаем писать}
     ost:=0;
     for i:=ns downto 1 do begin  {Перебираем символы строки s с конца}
         c:=Ord(s[i])-48;       {Текущий символ}
         re:=(Ord(r[cur])-48)+c; {Складываем с текущим символом из r}
         if ost<>0 then re:=re+ost; {Если есть число в уме - добавляем}
         if re>9 then begin {Сумма двух чисел больше 9 -}
            ost:=re div 10;  {Делим ее на число в уме}
            re:=re mod 10;        {и число, которое пишем}
         end
         else ost:=0;       {Иначе остатка нет}
         r[cur]:=Chr(re+48);
         cur:=cur-1;
     end;
     if ost<>0 then {Оставалось число в остатке - добавить его к строке}
       r[cur]:=Chr(ost+48);
end;
 
procedure Mul1 (n1:integer;var s1:string; s2:char;
                var n2:integer;var res:string);
   {Умножает строку s1 длиной n1 на число s2 и пишет
    результат в строку res длиной n2}
var i,r,ost,c:integer;
begin
     ost:=0;
     for i:=n1 downto 1 do begin
         c:=Ord(s1[i])-48;
         r:=c* (Ord (s2)-48);
         if ost<>0 then r:=r+ost; {Было в уме - прибавляем}
         if r>9 then begin
            ost:=r div 10;      {В уме}
            r:=r mod 10;        {Пишем}
         end
         else ost:=0; {Результат умножения меньше 10 - нет остатка}
         r:=r+48;
         res[n2]:=Chr(r); n2:=n2+1;
     end;
     if ost<>0 then begin
      ost:=ost+48;
      res[n2]:=Chr(ost);
     end
     else n2:=n2-1;
end;
 
procedure Reverse (n:integer; var s:string);
var i,n2:integer;      {Обращает строку}
    c1:char;
begin
     n2:=n div 2;
     for i:=1 to n2 do begin
         c1:=s[i];
         s[i]:=s[n-i+1];
         s[n-i+1]:=c1;
     end;
end;
 
 
function strlen_ (var s:string):integer;
var len:integer; {считает длину строки}
begin
     len:=0;
     while s[len]<>#0 do len:=len+1;
     if len>0 then len:=len-1;
     strlen_:=len;
end;
 
procedure Mul (var s1,s2,s:string);     {Умножает 2 числа}
var i,i1,i2,n1,n2,nr,ns,sdvig:integer;
var res:string;
begin
     n1:=strlen_ (s1);
     n2:=strlen_ (s2);
     ns:=maxlen;
     sdvig:=0;
     for i:=1 to maxlen do s[i]:='0';
     for i2:=n2 downto 1 do begin
         nr:=1;
         Mul1 (n1,s1,s2[i2],nr,res);
         Reverse (nr,res);
         AddTo (ns,s,nr,res,sdvig);
         sdvig:=sdvig+1;
     end;
end;
 
var s1,s2,s:string;
    i:integer;
 
begin
     writeln ('Строка 1:'); readln (s1);
     writeln ('Строка 2:'); readln (s2);
     Mul (s1,s2,s);
     writeln ('Результат:');
     i:=1; {Нули в начале не печатаем}
     while s[i]='0' do i:=i+1;
     repeat
      write (s[i]);
      i:=i+1;
     until i>maxlen;
end.
0
03.12.2013, 12:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2013, 12:27
Помогаю со студенческими работами здесь

Определить все натуральные числа m, не превосходящие числа N. Сумма всех цифр числа m-простое число.
Уславие Определить все натуральные числа m, не превосходящие числа N. Сумма всех цифр числа...

Как написать программу-калькулятор чтобы было можно додавать 2 числа, 3 числа, 4 числа, n чисел?
Как написать программу-калькулятор чтобы было можно додавать 2 числа, 3 числа, 4 числа, n чисел?

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

За 1 просмотр файла вывести сначала числа меньше а, потом числа из промежутка а b, затем, числа больше b
Дан файл с числами типа float, пользователь вводит 2 числа а и b, за 1 просмотр файла нужно вывести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru