Программируем

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

Join the forum, it's quick and easy

Программируем

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

Программируем

Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.
Программируем

На нашем форуме программистов вы сможете найти софт для программирования и другие программы. На форуме обсуждаются многие языки программирования, задачи и их решения. Используются языки: C, Assembler, Pascal, Delphi, Flash и другие.

Последние темы

» Арена искусственных интеллектов Gridwars
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyСр Окт 12, 2016 2:43 am автор SeriousPasha

» требуется несколько JS разработчиков
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyПт Окт 07, 2016 10:19 pm автор mrktwn1

» Защита приложения от взлома
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyЧт Июн 18, 2015 10:28 pm автор stradi

» Ищите программиста или дизайнера?
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyПт Мар 27, 2015 6:25 am автор фриланс

» Создание и продвижение сайтов, их развитие.
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyСр Мар 25, 2015 12:40 am автор asdfghhgfdsa

» Исходники для студентов + скайп-консультации,помощь в написании программ
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyВт Окт 07, 2014 11:25 pm автор Horpion

» IT- технологии для развития бизнеса
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyПн Июн 23, 2014 6:11 pm автор dvos12

» Стенли Кубрик "С Широко закрытыми Глазами"
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyЧт Июн 12, 2014 2:01 am автор Vertuozzz

» Каталог популярных хостинг компаний
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. EmptyСб Май 10, 2014 7:18 pm автор naik

Самые активные пользователи

Aster (142)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
Exkalibur (89)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
Чебурашка (63)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
Administrator (34)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
ak95 (8)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
Пушкин (7)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
K4_ (7)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
LuDa (7)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
Goldcoding (6)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 
Admin (6)
Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_leftПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. BarПроизведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Bar_right 

Партнеры

Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Top100 Rambler's Top100

Участников: 3

    Произведение длинных чисел. Длинная арифметика. Pascal, Delphi.

    Aster
    Aster
    Admin
    Admin


    Сообщения : 142
    Очки : 274
    Репутация : 11
    Дата регистрации : 2010-01-07

    Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Empty Произведение длинных чисел. Длинная арифметика. Pascal, Delphi.

    Сообщение автор Aster Пн Май 31, 2010 1:23 am

    Перед просмотром этой темы просмотрите эти: https://progaem.forum2x2.ru/forum-f3/tema-t81.htm
    https://progaem.forum2x2.ru/forum-f3/tema-t82.htm

    Итак, умножать мы будем по принципу "столбика", как складывали и вычитали.

    Есть 2 типа умножения в длинной арифметике. Это умножение длинного числа на короткое и длинного на длинное.
    В этой теме я предоставлю код обеих процедур.

    Умножение длинного числа на короткое:
    На самом деле все просто.
    Умножаем по очереди каждый элемент массива длинного числа на наше короткое число. Записываем результат, а в ячейку длинного числа(результата функции) записываем не этот результат, а его остаток от деления на константу base(см. https://progaem.forum2x2.ru/forum-f3/tema-t81.htm), которая отвечает за количество цифр в текущей ячейке длинного числа. А сам остаток после этого делим на эту константу.
    То есть, если текущий результат от умножения получился n-значным, то в основной результат запишем число, количество цифр которого будет равно baselen. А остальную часть оставим.

    Может быть, на словах это трудно понять, смотрите код.

    Код:

    Function scalmul(Var a: TLong; c: integer): TLong;
    Var i, t: integer;
        b: TLong;
    Begin
      fillchar(b, sizeof(b), 0);
      if c = 0 then //При умножении на 0 всегда будет 0
      begin
        b[0] := 1;
        b[1] := 0;
        exit;
      end;
      b[0] := a[0];
      t := 0;
      For i := 1 to b[0] do
      begin
        t := t + a[i] * c; //В результат записываем пред. результат и результат умножения.
        b[i] := t mod base; //В результирующее длинное число записываем результат умножения, так, чтобы в ячейке было ровно baselen знаков.
        t := t div base;
      end;
      While (t <> 0) do //Если в конце остался еще какой-то остаток, то записываем его поразрядно.
      begin
        inc(b[0]);
        b[b[0]] := t mod base;
        t := t div base;
      end;
    End;

    Это вся процедура. Не обязательно вникать в смысл и читать объяснение, т.к оно может быть трудно для понимания. Достаточно просто скопировать функцию в Ваш код, функция рабочая.

    Теперь рассмотрим умножение длинного числа на длинное.

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

    Код:

    Function mul(Var x, y: TLong): TLong;
    Var c: TLong;
        i, j, t: integer;
    Begin
      c := fillchar(c, sizeof(c), 0);
      t := 0;
      For i := 1 to a[0] do
      begin
        t := 0;
        For j := 1 to b[0] do
        begin
          t := t + c[i + j - 1] + a[i] * b[j];
          c[i + j - 1] := t mod base;
          t := t div base;
        end;
        j := b[0] + i;
        While (t <> 0) do
        begin
          c[j] := t mod base;
          t := t div base;
          inc(j);
        end;
      end;
      c[0] := maxn; //длина результата = макс. размер числа. MaxN - константа.
      While(c[c[0]] = 0) and (c[0] > 1) do dec(c[0]);
      mul := c;
    End;

    Вроде все правильно, но может быть напутал с begin, end. Если найдете баг, сообщите.
    avatar
    Sergey
    Новичек
    Новичек


    Сообщения : 1
    Очки : 1
    Репутация : 0
    Дата регистрации : 2010-10-22

    Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Empty Re: Произведение длинных чисел. Длинная арифметика. Pascal, Delphi.

    Сообщение автор Sergey Пт Окт 22, 2010 2:15 pm

    большое спасибо за код я его подправил всего 2 бага



    Function mul(Var a, b: TLong): TLong; // первый баг
    Var c: TLong;
    i, j, t: integer;
    Begin
    Fillchar(c, sizeof(c), 0); // второй
    t := 0;
    For i := 1 to a[0] do
    begin
    t := 0;
    For j := 1 to b[0] do
    begin
    t := t + c[i + j - 1] + a[i] * b[j];
    c[i + j - 1] := t mod base;
    t := t div base;
    end;
    j := b[0] + i;
    While (t <> 0) do
    begin
    c[j] := t mod base;
    t := t div base;
    inc(j);
    end;
    end;
    c[0] := maxn;
    While(c[c[0]] = 0) and (c[0] > 1) do dec(c[0]);
    mul := c;
    End;

    хотя это не баги
    avatar
    saysmonic
    Новичек
    Новичек


    Сообщения : 1
    Очки : 1
    Репутация : 0
    Дата регистрации : 2011-08-18

    Произведение длинных чисел.  Длинная арифметика. Pascal, Delphi. Empty Re: Произведение длинных чисел. Длинная арифметика. Pascal, Delphi.

    Сообщение автор saysmonic Чт Авг 18, 2011 7:13 pm

    Function scalmul(Var a: TLong; c: integer): TLong;
    Var i, t: integer;
    b: TLong;
    Begin
    fillchar(b, sizeof(b), 0);
    if c = 0 then //При умножении на 0 всегда будет 0
    begin
    b[0] := 1;
    b[1] := 0;
    exit;
    end;
    b[0] := a[0];
    t := 0;
    For i := 1 to b[0] do
    begin
    t := t + a[i] * c; //В результат записываем пред. результат и результат умножения.
    b[i] := t mod base; //В результирующее длинное число записываем результат умножения, так, чтобы в ячейке было ровно baselen знаков.
    t := t div base;
    end;
    While (t <> 0) do //Если в конце остался еще какой-то остаток, то записываем его поразрядно.
    begin
    inc(b[0]);
    b[b[0]] := t mod base;
    t := t div base;
    end;
    End;
    первая функция из всех что в этой теме, не знаю по какой причине, но не работаетSad

    P.S. большое спасибо автор за информацию о больших числах, давно как то искал ничего стоящего не нашел, а тут случайно наткнулся и прям получил удовлетворение от информацииWink

      Текущее время Пт Апр 26, 2024 7:20 pm