10000的阶乘的算法(大数的阶乘)
很多天没有更新自己的Blog了,前几天拿到一个题目.就是写一段程序计算10000的阶乘.当时我还以为这题目非常简单,没想到还是需要动点大脑的.花了将近半个小时才搞定,拿出来分享一下.
为什么不能用普通的方法来写呢,比如说递归?在我的教科书上可是用的是递归呀?不知道你注意没有,如果是100的阶乘的话,其结果肯定是非常大的,以我们现有语言的数据类型肯定是没法使用的,就拿C来说,long型能存的下100的阶乘吗?未必.所以我就使用数组来存储结果的每一位,然后输出每一位不就是结果吗.
那么具体怎样去做?
首先确定结果的位数?如何确定呢?请看下面. 2!=1*2<=10*10
3!=1*2*3<=10*10*10
.......
所以我们可以得出一个结论
n!<=10n
所以n!的位数可以这样计算:
两边取对数,即log10n!<=log1010n
两边n>=Log101+Log102+Log10 3+....Log10 n
这样n!的位数肯定等于小于Log101+Log102+Log10 3+....Log10 n.以上是错误的正确的推断如下:
可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,
对该式两边取对数,有=log10^n!即:
M = log10^1+log10^2+log10^3...+log10^n
循环求和,就能算得M值,该M是n!的精确位数。
位数的确定解决之后,就看看如何计算了.
看看如下代码:
1
int index=0;
2
long carrier=0;
3
double bitCount = 1;
4
int begin = 0;
5
6
for(index=2; index<=n; ++index)
7
{
8
long multiValue = 0;
9
bitCount += log10((long double)index);
10
if(arrValue[begin] == 0)
11
begin++;
12
13
for(int j=begin; j<int(bitCount); ++j)
14
{
15
multiValue += (index*arrValue[j]);
16
arrValue[j] = char(multiValue % 10);
17
multiValue /= 10;
18
}
19
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
19
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这里就是计算的关键了.注意一下进位问题即可.所有代码如下:
1![](/Images/OutliningIndicators/None.gif)
2
//////////////////////////////////////////////////////////////////////////
3
// Date created: 2005/07/12
4
// Author: Confach Zhang
5
// Purpose: 计算n!的值
6
//////////////////////////////////////////////////////////////////////////
7![](/Images/OutliningIndicators/None.gif)
8
9
using namespace std;
10
#include "StdAfx.h"
11
#include <iostream.h>
12
#include <conio.h>
13
#include <stdlib.h>
14
#include <math.h>
15
#include <stdio.h>
16
#include <iomanip.h>
17
18
int GetNumber(); //输入 n
19
int GetBitLength(int n); //求n!的位数
20
char* Initialize(int); //初始化存储结果的值
21
void PrintValue(char *a,int size); //打印值到屏幕
22
void PrintValue(char *a,int size,char* fileName); //打印值到文件
23
char* GetValue(int val); //计算
24
char* SubGetValue(char* ,int);
25![](/Images/OutliningIndicators/None.gif)
26![](/Images/OutliningIndicators/None.gif)
27
int main()
28
{
29
int value=GetNumber();
30
char fileName[16];
31
int size=GetBitLength(value);
32
char *pa = Initialize(size);
33![](/Images/OutliningIndicators/InBlock.gif)
34
//pa=GetValue();
35
pa=GetValue(value);
36![](/Images/OutliningIndicators/InBlock.gif)
37
PrintValue(pa,size);
38![](/Images/OutliningIndicators/InBlock.gif)
39
//sprintf(fileName,"%s","10000!.txt");
40
sprintf(fileName,"%d!.txt",value);
41
42
PrintValue(pa,size,fileName);
43
delete []pa; //note:
44
return 1;
45
}
46
//函数GetValue
47
// 求得计算结果
48
//返回结果
49
//History:
50
//1)char* GetValue()
51
//2)GetValue(int val)
52
// 参数:val 计算阶乘的值
53
char* GetValue(int val)
54
{
55
//定义一个数组存储阶乘的值
56
//首先得到10000!阶乘的位数
57
int VALUE=val;
58
int length=GetBitLength(VALUE);
59
char *arrValue = new char[length];
60
if(!arrValue) {
61
cout <<"申请内存失败!" << endl;
62
exit(1);
63
}
64
arrValue[0] = 1;
65
for(int i=1; i<length; i++)
66
arrValue[i] = 0;
67
arrValue=SubGetValue(arrValue,VALUE);
68
return arrValue;
69
}
70![](/Images/OutliningIndicators/None.gif)
71
char* SubGetValue(char* arrValue,int n)
72
{
73
int index=0;
74
long carrier=0;
75
double bitCount = 1;
76
int begin = 0;
77
78
for(index=2; index<=n; ++index)
79
{
80
long multiValue = 0;
81
bitCount += log10((long double)index);
82
if(arrValue[begin] == 0)
83
begin++;
84
85
for(int j=begin; j<int(bitCount); ++j)
86
{
87
multiValue += (index*arrValue[j]);
88
arrValue[j] = char(multiValue % 10);
89
multiValue /= 10;
90
}
91
}
92
return arrValue;
93
}
94![](/Images/OutliningIndicators/None.gif)
95
//得到计算阶乘的值,此函数为新增
96
int GetNumber()
97
{
98
int n;
99
cout << "请输入要计算阶乘的n值: ";
100
cin >> n;
101
while(n < 0) {
102
cout << "输入错误,请重新输入: ";
103
cin >> n;
104
}
105
if(n == 0)
106
exit(1);
107
return n;
108
}
109![](/Images/OutliningIndicators/None.gif)
110
//函数GetBitLength
111
// 求得计算结果的位数,本函数为新增加
112
//参数
113
// n 需要计算的阶乘的数
114
//返回结果的位数
115
int GetBitLength(int n)
116
{
117
double sum = 1.0;
118
for(int i=1; i<=n; i++)
119
sum += log10((long double)i);
120
return int(sum);
121
}
122
//-----------
123
//函数:Initialize
124
// 初始化存储结果的数组
125
//参数:
126
// size 数组的长度
127
//返回值
128
// 初始化后的数组
129
//-------------
130
char * Initialize(int size)
131
{
132
char *arrValue = new char[size];
133
if(!arrValue) {
134
cout << size<<"太大,申请内存失败!" << endl;
135
exit(1);
136
}
137
arrValue[0] = 1;
138
for(int i=1; i<size; i++)
139
arrValue[i] = 0;
140
return arrValue;
141
}
142
143
//-----------
144
//函数:PrintValue
145
// 将结果输入到屏幕上
146
//参数:
147
// buff 存储结果的数组
148
// buffLen 数组的长度
149
// fileName 文件名
150
//-------------
151
void PrintValue(char *buff, int buffLen)
152
{
153
int bit = 0;
154
int nCol=0;
155
for(int i=buffLen-1; i>=0; i--) {
156
if(bit % 10 == 0)
157
{
158
cout << " " ;
159
nCol++;
160
if(nCol==10)cout<<endl;
161
}
162
cout << int (buff[i]);
163
bit++;
164
}
165
cout << endl;
166
167
}
168
//-----------
169
//函数:PrintValue
170
// 将结果输入到一个文件中
171
//参数:
172
// buff 存储结果的数组
173
// buffLen 数组的长度
174
// fileName 文件名
175
//-------------
176![](/Images/OutliningIndicators/None.gif)
177
void PrintValue(char *buff,int buffLen,char *fileName)
178
{
179
int bit = 0;
180
int nCol=0;
181![](/Images/OutliningIndicators/InBlock.gif)
182
FILE *fp=NULL;
183
//-----------------------------
184![](/Images/OutliningIndicators/InBlock.gif)
185
if (fileName==NULL) return ;
186
fp=fopen(fileName,"wt");
187
if (fp==NULL)
188
{
189
printf("不能创建文件%s",fileName);
190
return ;
191
}
192![](/Images/OutliningIndicators/InBlock.gif)
193
for(int i=buffLen-1; i>=0; i--)
194
{
195
fprintf(fp,"%d",int(buff[i]));
196
197
if(bit % 9 == 0)
198
{
199
fprintf(fp,"%s"," ");
200
nCol++;
201
if(nCol==8)
202
{
203
fprintf(fp,"%s","\n");
204
nCol=0;
205
}
206
}
207
bit++;
208
209
}
210
fprintf(fp,"\n");
211
fclose(fp);
212
}
213![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/None.gif)
51
![](/Images/OutliningIndicators/None.gif)
52
![](/Images/OutliningIndicators/None.gif)
53
![](/Images/OutliningIndicators/None.gif)
54
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
70
![](/Images/OutliningIndicators/None.gif)
71
![](/Images/OutliningIndicators/None.gif)
72
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
94
![](/Images/OutliningIndicators/None.gif)
95
![](/Images/OutliningIndicators/None.gif)
96
![](/Images/OutliningIndicators/None.gif)
97
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
109
![](/Images/OutliningIndicators/None.gif)
110
![](/Images/OutliningIndicators/None.gif)
111
![](/Images/OutliningIndicators/None.gif)
112
![](/Images/OutliningIndicators/None.gif)
113
![](/Images/OutliningIndicators/None.gif)
114
![](/Images/OutliningIndicators/None.gif)
115
![](/Images/OutliningIndicators/None.gif)
116
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/InBlock.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
122
![](/Images/OutliningIndicators/None.gif)
123
![](/Images/OutliningIndicators/None.gif)
124
![](/Images/OutliningIndicators/None.gif)
125
![](/Images/OutliningIndicators/None.gif)
126
![](/Images/OutliningIndicators/None.gif)
127
![](/Images/OutliningIndicators/None.gif)
128
![](/Images/OutliningIndicators/None.gif)
129
![](/Images/OutliningIndicators/None.gif)
130
![](/Images/OutliningIndicators/None.gif)
131
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/InBlock.gif)
136
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
142
![](/Images/OutliningIndicators/None.gif)
143
![](/Images/OutliningIndicators/None.gif)
144
![](/Images/OutliningIndicators/None.gif)
145
![](/Images/OutliningIndicators/None.gif)
146
![](/Images/OutliningIndicators/None.gif)
147
![](/Images/OutliningIndicators/None.gif)
148
![](/Images/OutliningIndicators/None.gif)
149
![](/Images/OutliningIndicators/None.gif)
150
![](/Images/OutliningIndicators/None.gif)
151
![](/Images/OutliningIndicators/None.gif)
152
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
156
![](/Images/OutliningIndicators/InBlock.gif)
157
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
163
![](/Images/OutliningIndicators/InBlock.gif)
164
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
165
![](/Images/OutliningIndicators/InBlock.gif)
166
![](/Images/OutliningIndicators/InBlock.gif)
167
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
168
![](/Images/OutliningIndicators/None.gif)
169
![](/Images/OutliningIndicators/None.gif)
170
![](/Images/OutliningIndicators/None.gif)
171
![](/Images/OutliningIndicators/None.gif)
172
![](/Images/OutliningIndicators/None.gif)
173
![](/Images/OutliningIndicators/None.gif)
174
![](/Images/OutliningIndicators/None.gif)
175
![](/Images/OutliningIndicators/None.gif)
176
![](/Images/OutliningIndicators/None.gif)
177
![](/Images/OutliningIndicators/None.gif)
178
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
179
![](/Images/OutliningIndicators/InBlock.gif)
180
![](/Images/OutliningIndicators/InBlock.gif)
181
![](/Images/OutliningIndicators/InBlock.gif)
182
![](/Images/OutliningIndicators/InBlock.gif)
183
![](/Images/OutliningIndicators/InBlock.gif)
184
![](/Images/OutliningIndicators/InBlock.gif)
185
![](/Images/OutliningIndicators/InBlock.gif)
186
![](/Images/OutliningIndicators/InBlock.gif)
187
![](/Images/OutliningIndicators/InBlock.gif)
188
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
189
![](/Images/OutliningIndicators/InBlock.gif)
190
![](/Images/OutliningIndicators/InBlock.gif)
191
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
192
![](/Images/OutliningIndicators/InBlock.gif)
193
![](/Images/OutliningIndicators/InBlock.gif)
194
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
195
![](/Images/OutliningIndicators/InBlock.gif)
196
![](/Images/OutliningIndicators/InBlock.gif)
197
![](/Images/OutliningIndicators/InBlock.gif)
198
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
199
![](/Images/OutliningIndicators/InBlock.gif)
200
![](/Images/OutliningIndicators/InBlock.gif)
201
![](/Images/OutliningIndicators/InBlock.gif)
202
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
203
![](/Images/OutliningIndicators/InBlock.gif)
204
![](/Images/OutliningIndicators/InBlock.gif)
205
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
206
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
207
![](/Images/OutliningIndicators/InBlock.gif)
208
![](/Images/OutliningIndicators/InBlock.gif)
209
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
210
![](/Images/OutliningIndicators/InBlock.gif)
211
![](/Images/OutliningIndicators/InBlock.gif)
212
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
213
![](/Images/OutliningIndicators/None.gif)
下载代码
Last Updated: 2005年7月14日12:43:07 感谢kwklover 的建议
Last Updated: 2005年7月15日 8:48:20 感谢arbean.wu的精彩建议
Last Updated:2006年4月21日