blob: 3dc1d519bb3b859c1e6cc7891618aae96e094237 (
plain)
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
99
100
101
102
103
104
105
|
int a[1000];
int b[1000];
int c[1000];
int lena;
int lenb;
int lenc;
void add() { //b=b+a
int i;
if (lena>lenb) {
lenc = lena;
}
else{
lenc = lenb;
}
i=0;
while (i<=lenc) {
c[i] = 0;
i=i+1;
}
i=0;
while (i<lenc) {
c[i] = c[i] + (a[i] + b[i]);
if (c[i] >= 10) {
c[i+1] = c[i+1] + 1;
c[i] = c[i] - 10;
}
i=i+1;
}
if (c[lenc]) { //有进位 数组c的长度+1
lenc = lenc+1;
}
//b<-c
i=0;
while (i<lenc) {
b[i] = c[i];
i=i+1;
}
lenb = lenc;
}
void mult(int n) { //a=a*n n最大50,位数=lena+2
int i;
i=0;
while (i<=lena+2) {
c[i] = 0;
i=i+1;
}
lenc = lena;
i=0;
while (i<lenc) {
c[i] = c[i] + a[i] * n;
if (c[i] >= 10) {
c[i+1] = c[i+1] + (c[i] / 10);
c[i] = c[i] % 10;
}
i=i+1;
}
//最高位的值可能>=10 要展开成多位
while (c[lenc] >= 10) {
c[lenc+1] = c[lenc+1] + (c[lenc] / 10);
c[lenc] = c[lenc] % 10;
lenc = lenc+1;
}
if (c[lenc]) { //0<最高位<=10 也要长度+1
lenc = lenc+1;
}
//a<-c
i=0;
while (i<lenc) {
a[i] = c[i];
i=i+1;
}
lena = lenc;
}
int main()
{
int n;
int i;
n = getint();
a[0] = 1; //a=1
lena = 1;
b[0] = 0; //b=0
lenb = 1;
i=1;
while (i<=n) {
mult(i); //a=a*i
add(); //b=b+a
i=i+1;
}
i=lenb-1;
while (i>=0) {
putint(b[i]);
i=i-1;
}
putch(10);
return 0;
}
|