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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2012, 11:35   #1
timsc1
Новичок
Джуниор
 
Регистрация: 16.01.2010
Сообщений: 2
По умолчанию Большой Факториал!!!

Здравствуйте! Помогите с программой на Паскале:
Вычислить большие факториалы: 33! 55! 125! и т.д.
СПАСИБО!!!
timsc1 вне форума Ответить с цитированием
Старый 01.02.2012, 11:44   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык видимо вам надо реализовывать длинную арифметику (и поиск на форуме\гуглу).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 01.02.2012, 13:06   #3
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Код:
33! = 8683317618811886495518194401280000000
55! = 12696403353658275925965100847566516959580321051449436762275840000000000000
125! = 188267717688892609974376770249160085759540364871492425887598231508353156331613598866882932889495923133646405445930057740630161919341380597818883457558547055524326375565007131770880000000000000000000000000000000
Длинная арифметика конечно, Alex11223 тут прав на все 100%!
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 02.02.2012, 12:58   #4
MrReal
 
Регистрация: 11.11.2011
Сообщений: 4
По умолчанию

Код:
{$M 64000,0,0}
type
  dex=0..9;
  T=^BigNumber;
  BigNumber=record
    CurrentOrder:longint;{Текущий разряд}
    OrderNumber:dex;     {Значение в этом разряде}
    Pred,Next:T          {Ссылка на предыдущий и следующий разряды}
  end;
var
  MaxOrder1,MaxOrder2,MaxOrderRez:longint; {кол-во знаков}
  s1,s2:string;
  Q,R,REZ,RezBegin:T;
  a,i:word;

{Перевод строки в число по разрядам}
Procedure StrToBigNumber(var BigNum,BigNumBegin:T; s:string);{BigNum-число, BigNumBegin-ссылка на начало числа}
 var i:word; Hide:T; a:dex;
 begin
   New(BigNum);
   BigNumBegin:=BigNum;
   BigNum^.Pred:=nil;
   for i:=1 to length(s)+1 do
   begin
     val(s[i],a);
     BigNum^.OrderNumber:=a;
     BigNum^.CurrentOrder:=length(s)-i;
     New(BigNum^.Next);
     Hide:=BigNum;
     BigNum:=BigNum^.Next;
     BigNum^.Pred:=Hide
   end;
   BigNum^.Next:=nil;
   BigNum:=BigNumBegin;
   if BigNum^.CurrentOrder<>0 then
   begin
     repeat
       BigNum:=BigNum^.Next
     until BigNum^.CurrentOrder=0;
     BigNum^.Next:=NIL;
     BigNum:=BigNumBegin;
   end;
 end;

{Умножение чисел, записаных по разрядам}
Procedure PrBigNum(BigNum1,BigNumBegin1,BigNum2,BigNumBegin2:T; var PrBigNumber,PrBigNumberBegin:T);
 var i,j,k,iValue,iOrder:longint; Hide:T;
 begin
   MaxOrder1:=BigNum1^.CurrentOrder;
   MaxOrder2:=BigNum2^.CurrentOrder;
   MaxOrderRez:=MaxOrder1+MaxOrder2+2;

   New(PrBigNumber);
   PrBigNumberBegin:=PrBigNumber;
   PrBigNumber^.Pred:=NIL;

   for k:=1 to MaxOrderRez+1 do
   begin
     PrBigNumber^.CurrentOrder:=MaxOrderRez-k;
     New(PrBigNumber^.Next);
     Hide:=PrBigNumber;
     PrBigNumber:=PrBigNumber^.Next;
     PrBigNumber^.Pred:=Hide
   end;
   PrBigNumber^.Next:=NIL;
   PrBigNumber:=PrBigNumberBegin;

   for i:=0 to MaxOrder1 do
     for j:=0 to MaxOrder2 do
     begin
       iOrder:=i+j;
       BigNum1:=BigNumBegin1;
       while BigNum1^.CurrentOrder <> i do
         BigNum1:=BigNum1^.Next;
       while BigNum2^.CurrentOrder <> j do
         BigNum2:=BigNum2^.Next;
       iValue:=BigNum1^.OrderNumber * BigNum2^.OrderNumber;
       While iValue <> 0 do
       begin
         PrBigNumber:=PrBigNumberBegin;
         while (PrBigNumber^.CurrentOrder <> iOrder)and(PrBigNumber^.Next<>nil) do
           PrBigNumber:=PrBigNumber^.Next;
         iValue:=iValue+PrBigNumber^.OrderNumber;
         PrBigNumber^.OrderNumber:=iValue mod 10;
         iValue:=iValue div 10;
         inc(iOrder)
       end;
       BigNum1:=BigNumBegin1;
       BigNum2:=BigNumBegin2
     end;

   PrBigNumber:=PrBigNumberBegin;
   while (PrBigNumber^.OrderNumber = 0)and(PrBigNumber^.CurrentOrder > 0) do
   begin
     PrBigNumber:=PrBigNumber^.Next;
     dispose(PrBigNumber^.Pred)
   end;
   PrBigNumber^.Pred:=Nil;
   PrBigNumberBegin:=PrBigNumber;

   if PrBigNumber^.CurrentOrder <> 0 then
   begin
     repeat
       PrBigNumber:=PrBigNumber^.Next
     until PrBigNumber^.CurrentOrder=0;
     PrBigNumber^.Next:=NIL;
     PrBigNumber:=PrBigNumberBegin
   end
   else PrBigNumber^.Next:=Nil;

  end;


BEGIN
  write('Введите число, факториал которого хотите найти:');readln(a);
  if a = 0 then write('1') else
  begin
    i:=1; str(i,s1); StrToBigNumber(Rez,RezBegin,s1);
    for i:=1 to a-1 do
    begin
      str(i+1,s2);
      StrToBigNumber(Q,R,s2);
      PrBigNum(Q,R,Rez,RezBegin,Rez,RezBegin);
      write('.');
    end;
    writeln;
    while Rez^.CurrentOrder <> 0 do
    begin
      write(Rez^.OrderNumber);
      Rez:=Rez^.Next
    end;
    write(Rez^.OrderNumber)
  end;
  readln
end.
Такое подойдет?
MrReal вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Факториал Kozak_Aleksei Помощь студентам 1 25.01.2012 00:12
Факториал ArchiBishop Помощь студентам 0 26.01.2011 23:20
Большой факториал на BigInteger RIO Общие вопросы по Java, Java SE, Kotlin 3 12.09.2010 10:32
Факториал seredkin Microsoft Office Excel 4 03.06.2010 15:44
Факториал. dimka660i Помощь студентам 11 10.10.2009 23:28