IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> факториалы больших чисел
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Мужской

Репутация: -  0  +


Требуется найти факториалы всех чисел от 1 до 100. Стандартный цикл не канает, т.к. в longint не влезет факториал ста... Есть подозрение что это можно реализовать рекурсией, но как? Что делать???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






sqrt
Держи правильную программу (она пишет факториалы чисел 1 - 100 в файл "fact_100.txt"):
Код

Const
 Base = 10000; { system base }
 maxLen = 300; { max digits length }

 { digits delimiter for output, '|' for example }
 DigitSep: String = '';

     { getting max of (Base-1) and (MaxLen), so }
     { we could store length in the array item  }
     Max = (Base-1+MaxLen+Abs(Base-1-MaxLen)) Div 2;

Type
 Digit = 0..Pred(Base);            { type for the digit storing }
 Inter = 0..Pred(Base)*Succ(Base); { type for the temporary use }
 Index = 0..maxLen;                { type for the digis number storing }

 { type for the very long integer (VLI) storing }
 { item #0 stores number of digits in VLI       }
 LargeInt = Array [0..MaxLen] Of 0..Max;


{ called when overflow detected }
Procedure Overflow(Const s : String);
 Begin
   WriteLn('Error:'#1310'Overflow when making ', s);
   Halt(1)
 End;

{ LargeInt initialization by (x) number --  A := x }
{ ASSERT: using LongInt instead of Digit, }
{ guessing that MaxLongInt >= Base-1 }
Procedure Init(Var A: LargeInt; x: LongInt);
 Var i: Index;
 Begin
   FillChar(A, SizeOf(A), 0); i := 0;
   Repeat
     If i = maxLen Then Overflow('Init');
     Inc(i); A[i] := x mod Base;
     x := x div Base
   Until x = 0;
   A[0] := i
 End;


{ A := A * x }
Procedure MulDigit(Var A: LargeInt; x: Digit);
 Var i: Index; T: Inter;
 Begin
   T := 0;
   For i := 1 To A[0] Do
     Begin
       T := Inter(A[i])*x + T;
       A[i] := T mod Base; T := T div Base
     End;
   If T > 0 Then
     Begin
       If A[0] = maxLen Then Overflow('MulDigit');
       Inc(A[0]); A[A[0]] := T
     End
 End;


{ A := n! }
Procedure Fact(Var A: LargeInt; n: LongInt);
 Var T: LargeInt; i: LongInt;
 Begin
   Init(T, 1);
   For i := 2 To n Do
     MulDigit(T, i);
   A := T
 End;

{ Printing LargeInt  --  Write(A) }
Procedure Print(Var f: Text;
         Const A: LargeInt);
 Var
   i: Index; k: Digit; s: String;
 Begin
   Str(Base - 1, s); k := Length(s);
   Write(f, A[A[0]]);
   For i := A[0]-1 DownTo 1 Do
     Begin
       Str(A[i], s);
       While Length(s) < k Do s := '0' + s;
       Write(f, DigitSep, S)
     End
 End;

{ main program }
Var
 f: LargeInt; i: LongInt;
 out: Text;
begin
 Assign(out, 'fact_100.txt');
 ReWrite(out);

 For i := 1 To 100 do
   Begin
     Fact(f, i);
     Print(out, f); writeln(out); writeln(out)
   End;

 Close(out)
end.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.09.2025 4:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name