![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
![]() Маленький Принц ![]() Группа: Почетный форумчанин Сообщений: 2279 Регистрация: 5.1.2007 Вставить ник Цитата Из: Украина, Киев Пользователь №: 3475 Страна: ![]() Пол: ![]() ![]() |
Люди, я туплю страшно. Помогите :?
Вообщем задача: Умножить два длинных числа (длинная арифметика). Дано: Два файла: 1й: 1я строка- длинна 1го числа;2я строка- длинная 2го числа; 3я строка- 1е число; 4я строка- 2е число. 2й: в нем результат умножения. Числа заносятся в массивы. перемножаются, и со сдвигом записываются в двумерный массив. Числа с двумерного массива сумируются, и результат заносится в обычный массив. (Вообщем как в столбик, через массивы). Воть, если что несовсем понятно - спрашивайте. А процедурка нужна поскорее. Ибо последнюю лабу могу завалить :?: :idea: ЗЫ в инэте смотрел, то что нужно не нашел. -------------------- Бу!
![]() |
|
|
![]() |
![]()
Сообщение
#2
|
|
![]() Маленький Принц ![]() Группа: Почетный форумчанин Сообщений: 2279 Регистрация: 5.1.2007 Вставить ник Цитата Из: Украина, Киев Пользователь №: 3475 Страна: ![]() Пол: ![]() ![]() |
Етерналко, может и оптимальнее, в паскаль не вставлял, ибо ты юзаешь сдесь динамический массив, а они появляются только в делфи, т.е. в паскале тебе выдаст ошибку
![]() Нужно указывать от 1 .. и до какого-то определенного числа. (кстати я пробывал считать в программе число в переменную, потом вызвать процедуру, и сделать массив 1..та переменная. Всеравно не вышло, хотя переменную я считал раньше нежели определил массив, и значение так же передал в процедуру, т.е. в делфи/Си все было бы Окей. Негетив, Я написал процедуру умножения. Только трабл такой получается. Считает оно все правильно, но только если массивы до 10. Т.е. мое "длинное" число максимум из 10 цыфр. Если больше 10 и где-то до 250 - просто виснет (долго очень думает, я так и не дождался результат. Если же больше 250 - даже не компилируется, сразу кидает ошибку, что мало памяти. А все (на сколько я понимаю) из-за двумерного массива. Вот мои две процедуры: Это рандом, который по заданому n генерирует число из n цыфр: Procedure rndm(n1, n2: integer); var i,temp: integer; f: text; begin randomize; assign(f, 'c:\in.txt'); rewrite(f); writeln(f, n1); writeln(f, n2); temp:= 0; while temp = 0 do temp:= random(9); write(f, temp,' '); for i:= 2 to n1 do write(f, random(9),' '); writeln(f); temp:= 0; while temp = 0 do temp:= random(9); write(f, temp,' '); for i:= 2 to n2 do write(f, random(9),' '); close(f); end; И вторая, это уже само умножение: Procedure umnoj; var f,g: text; i,j,k,l,x,y,p,s: integer; a,a1,b,b1: array [1..max] of byte; c: array [1..max,1..max] of byte; go_on: boolean; begin assign(f, 'c:\in.txt'); assign(g, 'c:\out.txt'); reset(f); rewrite(g); for k:= 1 to max do begin a[k]:= 0; a1[k]:= 0; b[k]:= 0; b1[k]:= 0; end; for k:= 1 to max do for l:= 1 to max do c[k,l]:= 0; readln(f, i); readln(f, j); for k:= 1 to i do read(f, a1[k]); for k:= 1 to j do read(f, b1[k]); for k:= 1 to max do begin a[max-i+k]:= a1[k]; a1[k]:= 0; end; for k:= 1 to max do begin b[max-j+k]:= b1[k]; b1[k]:= 0; end; p:= 0; s:= 0; for l:= max downto 1 do begin for k:= max downto 1 do begin p:= a[k]*b[l]+p; c[k-s,max-l+1]:= p mod 10; p:= p div 10; end; inc(s); end; for l:= max downto 1 do begin a1[l]:= 0; for k:= 1 to max do a1[l]:= a1[l]+c[l,k]; end; go_on:= true; l:= max; p:= 0; while go_on do begin a1[l]:= a1[l]+p; p:= a1[l] div 10; a1[l]:= a1[l] mod 10; dec(l); go_on:= not ((p=0) and (a1[l]=0)); end; for l:= 1 to max do write(g, a1[l]); close(f); close(g); end; главная программа: var n1,n2: integer; begin write('Vvedite dlinnu 1 chisla: '); readln(n1); write('Vvedite dlinnu 2 chisla: '); readln(n2); rndm(n1, n2); umnoj; end; Не пойму что может быть не так :? -------------------- Бу!
![]() |
|
|
![]() ![]() |
![]() |
Текстовая версия Архив форума | Сейчас: 27.7.2025, 11:46 |
![]() |
![]() |