![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
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. |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 17:31 |