主题:阶乘(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				
				我立马写出来!
							 
									
			
我来回复