主题:阶乘(difficult)
abcwuhang
[专家分:1840] 发布于 2006-10-29 17:08:00
[em10][em10]
输入一个数,要求你输出它的阶乘的答案.(注意:输入的这个数小于等于10的7次方!!!)
(我用数组来保存数据,但到10000以上就爆机了.汗~~~~)
[em18][em18][em10][em10]
回复列表 (共28个回复)
沙发
abcwuhang [专家分:1840] 发布于 2006-10-29 19:36:00
不好意思,输出的是阶乘答案的位数
板凳
maxumi [专家分:2200] 发布于 2006-10-30 08:41:00
乘到10000就爆了, 这是正常现象
因为你把每一位都记录下来了......
我们其实只需要记录前几位
比如计算9!的位数
从1开始乘
1*2=2
2*3=6
6*4=24
现在24变成2位数了, 我们把小数点向左移一位, 24--->2.4 并记录小数点移位次数(现在是1次)
2.4*5=12
同上, 把小数点向左移一位, 12--->1.2 现在小数点移了2位了
1.2*6=7.2
小数点前还是1位数, 无须移位, 无视
7.2*7=50.4
再移, 50.4--->5.04, 移位3次了
5.04*8=40.32
再移, 40.32--->4.032, 移位4次了
4.032*9=36.288
再移, 36.288--->3.6288, 移位5次了
这样共移位5次, 加上3.6288小数点前还有1位, 所以9!是6位数.
根本不用开数组
以上
3 楼
maxumi [专家分:2200] 发布于 2006-10-30 14:14:00
顶上来(某考古学家挖坟挖的真快XD)
4 楼
abcwuhang [专家分:1840] 发布于 2006-11-04 14:51:00
我用ln自然对数解决了!!!
5 楼
liangbch [专家分:1270] 发布于 2007-04-28 17:26:00
可以看看这个网站( blog.csdn.net/liangbch), 内有大数阶乘的最详尽的算法讨论和代码。
6 楼
万里长城 [专家分:340] 发布于 2007-05-13 11:13:00
var n,i:longint;
begin
reapet
writeln('input n=');
readln(n);
until n>=10000000;
i:=1;
for j:=1 to n do begin
j:=i
j:=j*n;
end;
writeln(i);
end.
7 楼
abcwuhang [专家分:1840] 发布于 2007-06-14 21:00:00
这可以吗?太大了.
8 楼
dorremon1992 [专家分:870] 发布于 2007-07-04 17:14:00
一些电脑的单精度与双精度长度不一
会导致一台机子能运行另一台则不行
编之前应先调调pas的设置
9 楼
122183008 [专家分:20] 发布于 2007-07-06 12:06:00
用递归不就简单解决了吗?我高一的都知道!
10 楼
122183008 [专家分:20] 发布于 2007-07-06 12:11:00
我立马写出来!
我来回复