![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
sqrt |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Репутация: ![]() ![]() ![]() |
Требуется найти факториалы всех чисел от 1 до 100. Стандартный цикл не канает, т.к. в longint не влезет факториал ста... Есть подозрение что это можно реализовать рекурсией, но как? Что делать???
|
![]() ![]() |
volvo |
![]()
Сообщение
#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. |
![]() ![]() |
![]() |
Текстовая версия | 9.09.2025 4:25 |