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

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

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

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





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

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


Требуется найти факториалы всех чисел от 1 до 100. Стандартный цикл не канает, т.к. в longint не влезет факториал ста... Есть подозрение что это можно реализовать рекурсией, но как? Что делать???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 21.12.2004 13:05
Сообщение #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

 



- Текстовая версия 18.07.2025 17:31
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"