Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/41: Рейтинг темы: голосов - 41, средняя оценка - 4.85
0 / 0 / 1
Регистрация: 22.12.2012
Сообщений: 7

Умножение длинных чисел

30.01.2013, 20:27. Показов 8598. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проверьте код,пожалуйста,верно ли реализованна задача: заданы две строки шестнадцатеричных символов (длинное шестнадцатеричное число в символьной форме).Разработать программу умножение первого длинного числа на второе. Произведение в форме строки с шестнадцатеричными символами.
Исходные данные извлекаются из входного текста файла, результаты записываются в выходной текстовый файл.

Интересует только умножение двух длинных чисел...за ввод и вывод из файла еще не бралась...Может можно как то по короче и по проще для Pascal ABC
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
program DLUMN;
 
{funkciya dlya preobrazovaniya chisla v stroku}
function roundex(x:real;k:integer):string;
var i:integer;
    s:string;
begin
 Str(x:1:k,S);{preobrazovanie v stroku s zadannim kol-vom znakov}
 roundex:=s;
end;
 
{funkciya dlya polucheniya zadannoy stepeni chisla}
function potens(x , e :longint): real;
var i : longint;
    p : real;
begin
 p := 1;
 if e = 0 then p := 1 else{0-vaya stepen}
 if e < 0 then{esli otricatelnaya stepen}
  begin
   for i := -1 downto e do p := p / x;
  end
 else
  begin
   for i := 1 to e do p := p * x; {vozvedenie v stepen}
  end;
 potens:=p;
end;
 
{funkciya dlya polucheniya nomera cifri}
function digt(ch: char): byte;
const
numstring: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
 i: byte;
 n: byte;
begin
 n := 0;
 for i := 1 to length(numstring) do{poisk simvola}
  if ch = numstring[i] then n := i - 1;
 digt := n;{vozvrat nomera}
end;
 
{preobrazovanie iz desyatichnoy v zadannyu sistemu}
function dec2basen(base: integer; dec: real; nd:integer): string;
const numstring: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
num : string;
i, j: integer;
c   : longint;
r: real;
snum:string;
begin
 if (dec = 0) or (base <2) or (base >36) then num := '0'
 else
 begin
 num := '';
 i := 0;
 c:=trunc(dec);
 r:=dec-c;
 while potens(base, i + 1) <= c do i := i + 1;{vozvedenie v naivishuy stepen}
 for j := 0 to i do
  begin
   {nakoplenie chisla}
   num := num + numstring[(c div trunc(potens(base, i - j))) + 1];
   c := c mod trunc(potens(base, i - j));
  end;
 end;
 
 dec2basen := num;
end;
 
{preobrazovanie iz zadannoy sistemu v desyatichnuy}
function basen2dec(base: integer; num: string; nd:integer): string;
 
const
 numset: set of char = ['0'..'9', 'A'..'Z'];
var
 j,t,k,len,point : integer;
 error: boolean;
 dec  : real;
begin
 dec := 0;
 error := false;
 if (base <2) or (base >36) then error := true;{esli netdopustimaya baza}
 
 len:=length(num);
 point:=0;
 for j:=1 to length(num) do{poisk kol-vo znakov do tochki}
  if num[j] = '.' then
   begin
    len:=j-1;
    point:=j;
    break;
   end;
 
 k:=0;
 for j := 1 to length(num) do
  if (num[j] <> '.') then
  begin
   k:=k+1;
   if (not (upcase(num[j]) in numset)) or (base < Digt(num[j]) + 1) then
   error:= true;
   {nakoplenie chisla}
   dec := dec + digt(upcase(num[j])) * potens(base, len - k);
  end;
 {esli korretno vozvrashaem chislo}
 if error then basen2dec := '0' else basen2dec := roundex(dec,nd);
end;
 
 
{******************************************************************************}
 
var s1,s2:integer;   {peremennye dlya preobrazovaniya v sistemy schisleniya}
    t,t2:string;
    tmp:real;
    code:integer;
 
    s16one,s16two:string; {peremennye dlya neposredstvennogo usloviya zadachi}
    des1,des2    :longint;
    r1           :integer;
    a,b          :text;
 
begin
 
    s1:=16;    {iz kakoi}
    s2:=10;    {v kakuyu}
 
     writeln('Ââåäèòå ïåðâîå ÷èñëî:');      readln(s16one);    {ñ÷èòûâàåì ñ êëàâ-û íà÷àëüíûå çíà÷åíèÿ}
     writeln('Ââåäèòå âòîðîå ÷èñëî:');      readln(s16two);
 
    {perevod chisel iz 16 v 10 sistemy schisleniya}
    t:=basen2dec(s1,s16one,2*0);
    val(t,tmp,code);
    t2:=dec2basen(s2,tmp,0);
    val(t2,des1,code);      {des1 = 1 ââåäåííîå ÷èñëî â 10-îé ñèñòåìå ñ÷èñëåíèÿ }
 
    t:=basen2dec(s1,s16two,2*0);
    val(t,tmp,code);
    t2:=dec2basen(s2,tmp,0);
    val(t2,des2,code);      {des2 = 2 ââåäåííîå ÷èñëî â 10-îé ñèñòåìå ñ÷èñëåíèÿ }
 
    {vychislyaem rezul'taty:}
    r1:=des1 * des2;   {ïðîèçâåäåíèå}
 
 
 
   {perevod chisel obratno iz 10 v 16 sistemy schisleniya}
   s1:=10;  {iz kakoi}
   s2:=16;  {v kakuyu}
 
    str(r1,t);
    val(t,tmp,code);
    writeln('ïðîèçâåäåíèå:',dec2basen(s2,tmp,0));  {vyvod rezul'tata}
 
readln;
end.
Добавлено через 22 часа 8 минут
Уважаемые...очень прошу гляньте код...правильно ли реализовано умножение длинных чисел...пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2013, 20:27
Ответы с готовыми решениями:

Умножение длинных чисел
Написал программу умножения. Выдаёт ошибку - выход за границы диапазона изменения индекса... Что мне поменять, чтоб заработало??? ...

Сложение длинных чисел
Составить программу, суммирующую два натуральных многозначных числа с количеством знаков более 20.

Сложение длинных чисел
Есть программа, но она с выбором системы счисления, подскажите, как сделать, чтобы можно было складывать только в 10 сс var x: string;...

6
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
31.01.2013, 09:59
В принципе неверно написана программа, вообще нет умножения длинных чисел.
Pascal
1
2
{vychislyaem rezul'taty:}
    r1:=des1 * des2;   {произведение}
Это обычное умножение чисел и результат должен укладываться в тип Integer.
А Вам нужно умножить примерно
1A25B56C58D13F12
x
F123456D12A456AAA
и получить результат в СС 16.
1
0 / 0 / 1
Регистрация: 22.12.2012
Сообщений: 7
31.01.2013, 14:47  [ТС]
А не подскажите мне ход мысли,если можно на примере...была уверена что не правильно,а как сделать правильно не соображу.Спасибо,что откликнулись!
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
31.01.2013, 15:04
Цитата Сообщение от kimberly Посмотреть сообщение
А не подскажите мне ход мысли
Вообще в двух словах не рассказать, найдите для начала что-то почитать про умножение длинных десятичных чисел.
А вообще суть в умножении столбиком.
1
0 / 0 / 1
Регистрация: 22.12.2012
Сообщений: 7
31.01.2013, 18:04  [ТС]
Для длинных десятичных чисел как то так?...возможно похоже на правду,а как для шестнадцатиричных пока не совсем поняла




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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
Program DlUmn;
 
Const NMax = 2000;
 
Type Digit = 0..9; DlChislo = Array[1..Nmax] Of Digit;
 
Var S : String;
 
    M, N, R, F : DlChislo;
 
    I, MaxF : Word;
 
    Logic : Boolean;
 
{Процедура обнуления длинного числа}
 
Procedure Zero(Var A : DlChislo);
 
Var I : Integer;
 
  Begin
 
    For I := 1 To NMax Do A[I] := 0;
 
  End;
 
{Функция определения количества цифр в записи длинного числа}
 
Function Dlina(C : DlChislo) : Integer;
 
Var I : Integer;
 
 Begin
 
   I := NMax;
 
   While (I > 1) And (C[I] = 0) Do I := I - 1;
 
   Dlina := I
 
 End;
 
{Процедура печати длинного числа}
 
Procedure Print(A : DlChislo);
 
Var I : Integer;
 
 Begin
 
    For I := Dlina(A) DownTo 1 Do Write(A[I] : 1);
 
    WriteLn
 
 End;
 
{Процедура преобразования длинного числа в массив цифр}
 
Procedure Translate(S : String; Var A : DlChislo;
 
                    Var OK : Boolean);
 
Var I : Word;
 
 Begin
 
   Zero(A); I := Length(S); OK := True;
 
   While (I >= 1) And OK Do
 
   Begin
 
      If S[I] In ['0'..'9']
 
      Then A[Length(S) - I+ 1] := Ord(S[I]) - 48
 
      Else OK := False;
 
      I := I - 1
 
   End
 
 End;
 
Procedure Multiplication(A, B : DlChislo; Var C : DlChislo);
 
Var I, J : Integer; P : Digit; VspRez : 0..99;
 
 Begin
 
  Zero(C);
 
  For I := 1 To Dlina(A) Do
 
  Begin P := 0;
 
        For J := 1 To Dlina(B) Do
 
        Begin
 
          VspRez := A[I] * B[J] + P + C[I + J - 1];
 
       C[I + J - 1] := VspRez Mod 10;
 
       P := VspRez Div 10
 
     End;
 
        C[I + J] := P
 
   End
 
 End;
 
{Основная программа}
 
Begin
 
   Repeat {повторяем ввод,пока число не будет введено правильно}
 
     Write('Введите первый множетель: ');
 
     ReadLn(S); Translate(S, M, Logic)
 
   Until Logic;
 
   Repeat
 
     Write('Введите второй множитель: ');
 
     ReadLn(S); Translate(S, N, Logic)
 
   Until Logic;
 
   Multiplication(M, N, R); Print(R)
 
End.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
01.02.2013, 14:26
Если числа вводить как строки, т.е не больше 255 разрядов, то можно написать и проще, этот код видимо для Делфи или Паскаля где есть длинные строки. Вам нужно определиться с длиной чисел, до 255 или больше.

Добавлено через 4 минуты
А СС16 отличается от СС10 тем что цифры при умножении, или в массивах от 0 до 15, а при вводе и выводе 0..9,A..F.

Добавлено через 19 часов 59 минут
Вот я написал вариант кода, не знаю нужен или нет.
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
uses crt;
const nmax=1000;//макс. число разрядов во вводимых числах
type mas=array[1..2*nmax] of byte;//тип масива, число разрядов *2 для результата
function vvod(var a:mas):integer;//ввод чисел
var c:char;
    n:integer;
begin
n:=0; //количество разрядов
repeat
c:=readkey; //вводим посимвольно
if c in ['0'..'9','A'..'F'] then //если допустимые
 begin
  write(c);//выводим
  n:=n+1; //добавляем разряд
  if c in ['0'..'9'] then a[n]:=ord(c)-48 //если цифра пишем в массив 0..9
  else a[n]:=ord(c)-55 //если буква 10..15
 end;
if (c=#13)or(n=nmax) then writeln //если Enter или макс. разрядов, новая строка
until (c=#13)or(n=nmax);//и выход
vvod:=n//кол. разрядов
end;
//собственно умножение
procedure umn(a,b:mas;na,nb:integer;var c:mas;var nc:integer);
var i,j,p,k:integer;
begin
for i:=1 to 2*nmax do c[i]:=0; //обнулим результат
for i:=na downto 1 do //перемножим поразрядно
for j:=nb downto 1 do
 begin
   c[na-i+2+nb-j]:=c[na-i+2+nb-j]+(c[na-i+1+nb-j]+a[i]*b[j])div 16;//в следующий разряд излишки
   c[na-i+1+nb-j]:=(c[na-i+1+nb-j]+a[i]*b[j])mod 16;//в текущий остаток от деления на 16
 end;
writeln('Результат:');
{пропускаем начальные нули}
i:=2*nmax;
while (c[i]=0)and(i>1)do i:=i-1;
{выводим результат}
for j:=i downto 1 do
if c[j] in [0..9] then write(c[j])
else write(chr(c[j]+55));
end;
 
var a,b,c:mas;
    na,nb,nc:integer;
begin
writeln('Введите 1 число в СС 16, конец ввода Enter');
na:=vvod(a);
writeln('Введите 2 число в СС 16, конец ввода Enter');
nb:=vvod(b);
umn(a,b,na,nb,c,nc)
end.
1
0 / 0 / 1
Регистрация: 22.12.2012
Сообщений: 7
02.02.2013, 20:42  [ТС]
Огромное спасибо за помощь,нужен,очень нужен...времени катастрофически не хватает...очень приятно ,что есть еще отзывчивые модераторы.Обещаю с Вашим кодом и длинной арифметикой разберусь,чтоб задавать меньше глупых вопросов.А Вам,огромный респект!!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.02.2013, 20:42
Помогаю со студенческими работами здесь

Ввод-вывод длинных чисел
Нужна помощь в написании программы! Надо реализовать программу ввод-вывод(числа вводятся с клавиатуры) анриально длинных чисел(очень...

Двунаправленные связанные списки: сложение длинных чисел
ребят помогите пожалуйста написать программу по сложению длинных чисел при помощи двунаправленных связанных списков

Создать программу для вычитания длинных чисел
Создайт программу для вычитания длинных чисел. Очень нужно

Сложение длинных чисел
Есть код но он для умножения. нужно переделать под сложение (на знак + не обращайте внимания =) ) type tNum = ^pNum; pNum = record...

Сложение длинных чисел
Даны 2 больших числа, состоящие не менее чем из 10 знаков. Найти сумму этих двух чисел


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru