-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path17-factorialp.pas
98 lines (93 loc) · 1.79 KB
/
17-factorialp.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
PROGRAM FactorialComp;
USES crt;
PROCEDURE factorialp (dn: LONGINT; VAR dr: EXTENDED; VAR dk: LONGINT);
CONST
j = 1000000;
eps = 0.0001;
phi = 1000000000000000;
VAR
ddr: EXTENDED;
di: LONGINT;
BEGIN
ddr := 1; dk := 0;
IF dn > 12 THEN
BEGIN
FOR di := 1 TO 12 DO
BEGIN
ddr := ddr * di;
END;
FOR di := 13 TO dn DO
BEGIN
IF ddr > phi THEN
BEGIN
ddr := ddr / j;
dk := dk + 6;
END;
IF ddr < eps THEN
BEGIN
ddr := ddr * j;
dk := dk - 6;
END;
IF ((ddr * di <= phi) AND (ddr * di >= eps)) THEN
BEGIN
ddr := ddr * di;
END
ELSE
BEGIN
IF (ddr * di) > phi THEN
BEGIN
ddr := (ddr * di) / j;
dk := dk + 6;
END;
IF (ddr * di) < eps THEN
BEGIN
ddr := ddr * di * j;
dk := dk - 6;
END;
END;
END;
END;
dr := ddr;
END;
VAR
N, NN, k: LONGINT;
r: EXTENDED;
BEGIN
N := 1; r := 1; k := 1; NN := 1;
WHILE N > 0 DO
BEGIN
ClrScr;
WriteLn('Factorial calculation of INTEGER number N.');
WriteLn('If you input N = 0, this program will stop.');
WriteLn('Note: 0! = 1. Max N = 200,000,000.');
WriteLn('');
Write('Input N = '); ReadLn(N);
WriteLn('');
IF N > 0 THEN
BEGIN
IF N <= 12 THEN
BEGIN
FOR k := 1 TO N DO
BEGIN
NN := NN * k;
END;
WriteLn('Factorial N! = ', NN);
END
ELSE
BEGIN
factorialp(N, r, k);
WriteLn('Factorial N! = ', r,' (*10^(',k,'))');
WriteLn('');
TextColor(LightRed);
WriteLn('Note: You should sum E**** and 10^(****)!');
END;
N := 1; r := 1; k := 1; NN := 1;
WriteLn('');
TextColor(LightGray);
WriteLn('Press any button to Continue...');
ReadKey;
END;
END;
WriteLn('Press any button to Exit...');
ReadKey;
END.