Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2011, 15:09   #1
IvaIlga
 
Регистрация: 05.05.2011
Сообщений: 3
Сообщение Умножение длинного числа на короткое (Турбо Паскаль)

Здравствуйте! Задали написать программу, но довести ее до работоспособного состояния не получается. Пожалуйста, исправьте ошибки и укажите мне на них. Вот сама задача: "Умножение длинного числа на короткое. Под коротким понимается целое число типа LongInt". Вот то,что у меня получилось:

Код:
 Program Multiplication_of_long_numbers;
type Tlong=record n:longint;
procedure Mul(Const A : TLong; Const K : Longlnt; Var C : TLong);
Var i : Integer;
Begin
FillChar (С, SizeOf(С), 0);
if K = 0 Then Inc(С[0])
else begin
For i:= l To A[0] Do
begin
C[i+l] := (LongInt(A[i]) * K + C[i]) Div Osn;
C[i] := (LongInt(A[i])* K + C[i]) Mod Osn
end;
iIf C[A[0]+1] > 0 Then C[0]:= A[0] + 1
else C[0]:= A[0]
end;
end;
var
s, t, r : longint;
begin
writeln('Vvedite chislo 1:');
readln(s);
writeln('Vvedite chislo 2:');
readln(t);
multLong(s,t,r);
writeln('Rezyltat:', r);
end.
IvaIlga вне форума Ответить с цитированием
Старый 05.05.2011, 15:34   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Под коротким понимается целое число типа LongInt
А под длинным у тебя вообще хз что понимается.
Пока не определишься с этим - дальнейшие твои потуги бессмысленны.

Цитата:
For i:= l To A[0] Do
A[0] - это что вообще за бред, если параметр A не строка и не массив, а запись ?
mss вне форума Ответить с цитированием
Старый 05.05.2011, 15:40   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) у Вас тип record не закрыт словом end (да и вообще, это не RECORD!)

2) TLong - у Вас тоже Longint

3) а с чего Вы взяли, что длинные числа (судя по описанию типа TLong - это longint??!

длинные числа, это, например 1000 десятичных знаков:
Код:
type TLong = array[1..1000] of byte;
p.s. на форуме были пример на длинную арифметику, посмотрите, как там записываются длинные числа...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.05.2011, 15:52   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Да, кажись в разделе Обсуждение программ
По данной теме есть статья (в двух частях) в журнале ПРОграммист, адрес найдете сами.
И если вам интересно - по моему очень скромному опыту написания длинной арифметики - гонять основания чисел в каждой операции для чисел с неизвестным числом разрядов, как минимум медленно. Проще их все сразу при получении переводить в определенную систему счисления, проводить операции, и уже потом возвращать число в нужной системе счисления. Касательно самого умножения - разложите задачу на составляющие - сначала реализуйте процедуру умножения длинного числа на один разряд (на одну цифру). А потом полноценное умножение.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 05.05.2011 в 15:56.
Utkin вне форума Ответить с цитированием
Старый 05.05.2011, 16:05   #5
IvaIlga
 
Регистрация: 05.05.2011
Сообщений: 3
По умолчанию

Проблема в том,что я новичок в Турбо Паскале (но специалист по web-дизайну, верстке сайтов..это мне легко дается. В этой сфере я с радостью подсказываю и помогаю решить ту или иную задачу), а тему длинная арифметика поняла не полностью, точнее принцип работы с длинными числами. Программу,код которой я указала, собрала из из разных кусочков. Постаралась подогнать под свою,но она все равно выдает ошибку. Буду очень благодарна,если вы поможете исправить код.
IvaIlga вне форума Ответить с цитированием
Старый 05.05.2011, 16:41   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Буду очень благодарна,если вы поможете исправить код
Так Вам уже три сообщения подряд твердят, что Ваш код нельзя исправить - его надо полностью переписывать!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.05.2011, 17:15   #7
IvaIlga
 
Регистрация: 05.05.2011
Сообщений: 3
Сообщение

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Так Вам уже три сообщения подряд твердят, что Ваш код нельзя исправить - его надо полностью переписывать!
Понятно. Я нашла код программы умножающий два длинных числа - более менее поняла его (Создается два массива для двух чисел,каждая цифра которого хранится отдельно в ячейке. А результат сохранятся в первый массив,в тот же,в котором хранится первое число). Что нужно изменить,чтобы длинное число умножить на короткое? я пробовала уменьшить длину второго массива,но тогда результат выводится с нулями.

Код:
program Mult;
uses crt;
var 
    row  : array[1..20000] of byte;
    col  : array[1..10000] of byte;
    nr,nc,dp : integer;
    c : char;
 procedure PrintResult;
begin
     write('Rezultat ');
     while (dp<=high(row)) do begin
        write(char(row[dp]+ord('0')));
        inc(dp);
     end;
     writeln;
end;
procedure Multiplying;
var i,j,cr,cc:integer;
    carry,sum:longint;
begin
    dp:=high(row); cr:=nr; cc:=nc;
    carry := 0;
    while (cc>0) do begin
        i:=cr; j:=cc; sum:=carry;
        while (i<=nr) and (j>=1) do begin
           sum:=sum+row[i]*col[j];
           inc(i); dec(j);
        end;
        row[dp]:=sum mod 10; dec(dp);
        carry:=sum div 10;
        if cr>1 then dec(cr) else dec(cc);
    end;
    while (carry<>0) do begin
        row[dp]:=carry mod 10;
        carry:=carry div 10;
        dec(dp);
    end;
    inc(dp);
end;
 begin
     fillchar(row,sizeof(row),0); fillchar(col,sizeof(col),0);
     writeln('Vvedite 1 chislo:');
     c:=#0;
     while NOT(c in ['0'..'9']) do c:=readkey;
     nr:=0;
     while (c in ['0'..'9']) do begin
        write(c);
        inc(nr); row[nr]:=ord(c)-ord('0');
        c:=readkey;
     end;
     writeln;
     writeln('Vvedite 2 chislo:');
     while NOT(c in ['0'..'9']) do c:=readkey;
     nc:=0;
     while (c in ['0'..'9']) do begin
        write(c);
        inc(nc); col[nc]:=ord(c)-ord('0');
        c:=readkey;
     end;
     writeln;
     Multiplying; 
PrintResult;
readkey;
end.
IvaIlga вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение вектора на матрицу. Паскаль xakkkkker Помощь студентам 2 18.06.2012 19:42
Программа поиска в строке (string) самого длинного симметричного слова [Паскаль] Henkel Помощь студентам 2 14.12.2010 20:41
ПАСКАЛЬ! умножение k-ой строки исходной матрицы на сумму элементов главной диагонали wrmarw Помощь студентам 5 08.05.2010 12:05
Переопределение оператора умножения для класса. Умножение числа на класс. capta1n Общие вопросы C/C++ 2 06.03.2010 16:50
Умножение массивов Паскаль+АСМ xVxSeRGxVx Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 24 21.02.2010 14:11