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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2011, 18:17   #1
morgan97
Пользователь
 
Регистрация: 08.01.2011
Сообщений: 28
По умолчанию большие числа

Здравствуйте. Как описывать и как работать с целочислинными значениями,которые превышают тип longint? например с числом 10^100
morgan97 вне форума Ответить с цитированием
Старый 21.11.2011, 18:19   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Как описывать и как работать с целочислинными значениями,которые превышают тип longint?

Примерно так, как это делает Walied Othman.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 21.11.2011, 18:19   #3
IT-man
АльTRUEи$т
Форумчанин
 
Аватар для IT-man
 
Регистрация: 19.03.2009
Сообщений: 784
По умолчанию

Цитата:
Как описывать
как string
Цитата:
как работать
Гуглить по словам "Длинная+Арифметика"
Цитата:
«Никто не войдет в Рай, имея хотя бы крупицу гордыни в своем сердце». «Аллах Красив и любит красоту. Гордыня означает отказ от истины и высокомерие»
IT-man вне форума Ответить с цитированием
Старый 21.11.2011, 18:22   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
как string
Необязательно. Можно просто как с массивом целых чисел.
_-Re@l-_ вне форума Ответить с цитированием
Старый 22.11.2011, 00:25   #5
Анатоль
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 74
По умолчанию

Действительно легче сразу описывать как массив целых чисел, чтобы каждый раз не переводить из строки в число и наооборот. За нас уже всё придумали. В длинной арифметике все операции, кроме деления длинного на длинное довольно просто реализуются. Я даже когда-то их все писал. Сча поищу исходники. Только я не умею нормально с отступами код вставлять.
Анатоль вне форума Ответить с цитированием
Старый 22.11.2011, 00:27   #6
Анатоль
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 74
По умолчанию

В общем тут оформлено всё в виде процедур. Выбирай какая нужна и пользуйся
Код:
program dlinka;
type
  mas = array[0..10000] of longint;
var
  A,B : mas;
  i,swap,x : longint;
  c : char;
procedure sum(a,b : mas);
var
  j,ost : longint;
begin
  ost := 0;
  if a[0] < b[0] then
    a[0] := b[0];
  for j := 1 to a[0] do
  begin
    A[j] := a[j]+b[j]+ost;
    if a[j] > 9 then
    begin
      a[j] := a[j]-10;
      ost := 1;
    end
    else
      ost := 0;
  end;
  if ost > 0 then
  begin
    inc(a[0]);
    A[A[0]] := ost;
  end;
  for j := A[0] downto 1 do
    write(A[j]);
  writeln;
end;
procedure razn(a,b : mas);
var
  j,ost : longint;
begin
  ost := 0;
  for j := 1 to a[0] do
  begin
    a[j] := a[j]-b[j]-ost;
    if a[j] < 0 then
    begin
      a[j] := a[j]+10;
      ost := 1;
    end
    else
      ost := 0;
  end;
  while (A[0] > 1) and (A[A[0]] = 0) do
    dec(A[0]);
  for j := A[0] downto 1 do
    write(A[j]);
  writeln;
end;
procedure myltiply(a : mas; x : longint);
var
  j,ost : longint;
begin
  ost := 0;
  for j := 1 to A[0] do
  begin
    A[j] := A[j]*x+ost;
    ost := A[j] div 10;
    A[j] := A[j] mod 10;
  end;
  while ost > 0 do
  begin
    inc(A[0]);
    A[A[0]] := ost mod 10;
    ost := ost div 10;
  end;
  for j := A[0] downto 1 do
    write(A[j]);
  writeln;
end;
procedure divide(a:mas; x : longint);
var
  ost,j : longint;
begin
  ost := 0;
  for j := A[0] downto 1 do
  begin
    ost := ost*10+A[j];
    A[j] := ost div x;
    ost := ost mod x;
  end;
  while (A[0] > 1) and (A[A[0]] = 0) do
    dec(A[0]);
  for j := A[0] downto 1 do
    write(A[j]);
  writeln;
end;
procedure myltiplyhuge(a,b : mas);
var
  c : mas;
  i,j,ost : longint;
begin
  for i := 0 to 10000 do
    C[i] := 0;
  for i := 1 to A[0] do
  begin
    ost := 0;
    j := 1;
    while (j <= b[0]) or (ost > 0) do
    begin
      C[i+j-1] := C[i+j-1]+A[i]*B[j]+ost;
      ost := C[i+j-1] div 10;
      C[i+j-1] := C[i+j-1] mod 10;
      inc(j);
    end;
  end;
  C[0] := A[0]+B[0];
  while (C[C[0]] = 0) and (C[0] > 1) do
    dec(C[0]);
  for j := C[0] downto 1 do
    write(C[j]);
  writeln;
end;
BEGIN
  for i := 0 to 10000 do
  begin
    A[i] := 0;
    B[i] := 0;
  end;
  while not eoln do
  begin
    read(c);
    inc(A[0]);
    A[A[0]] := ord(c)-ord('0');
  end;
  for i := 1 to (A[0] div 2) do
  begin
    swap := A[i];
    A[i] := A[A[0]+1-i];
    A[A[0]+1-i] := swap;
  end;
  readln;
  while not eoln do
  begin
    read(c);
    inc(B[0]);
    B[B[0]] := ord(c)-ord('0');
  end;
  for i := 1 to (B[0] div 2) do
  begin
    swap := B[i];
    B[i] := B[B[0]+1-i];
    B[B[0]+1-i] := swap;
  end;
  myltiplyhuge(a,b);
END.

Последний раз редактировалось Анатоль; 22.11.2011 в 00:33.
Анатоль вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
большие числа NiCola999 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 37 20.07.2011 16:26
Большие числа DRAgon™ Общие вопросы по Java, Java SE, Kotlin 12 29.01.2011 02:53
csv-файл большие числа nevadimka Microsoft Office Excel 1 14.03.2008 10:25
Большие числа Лубышев Помощь студентам 6 27.02.2008 22:57
Большие комплексные числа xoz Общие вопросы Delphi 0 24.02.2008 03:12