回 帖 发 新 帖 刷新版面

主题:阶乘(difficult)

[em10][em10]
输入一个数,要求你输出它的阶乘的答案.(注意:输入的这个数小于等于10的7次方!!!)
(我用数组来保存数据,但到10000以上就爆机了.汗~~~~)
[em18][em18][em10][em10]

回复列表 (共28个回复)

沙发

不好意思,输出的是阶乘答案的位数

板凳

乘到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 楼

顶上来(某考古学家挖坟挖的真快XD)

4 楼

我用ln自然对数解决了!!!

5 楼

可以看看这个网站( blog.csdn.net/liangbch), 内有大数阶乘的最详尽的算法讨论和代码。

6 楼

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 楼

这可以吗?太大了.

8 楼

一些电脑的单精度与双精度长度不一
会导致一台机子能运行另一台则不行
编之前应先调调pas的设置

9 楼

用递归不就简单解决了吗?我高一的都知道!

10 楼

我立马写出来!

我来回复

您尚未登录,请登录后再回复。点此登录或注册