主题:[求助]一道简单的题
风之落叶
[专家分:40] 发布于 2007-04-08 13:57:00
求n的阶层(n<100)
例:
5!=5×4×3×2×1
谢谢啦!
回复列表 (共25个回复)
21 楼
无所不能 [专家分:270] 发布于 2007-09-09 07:54:00
var
i,j:integer;
begin
j:=1;
read(i);
for i:=i dowento 1 do
j:=j*i;
writeln(j);
end.
22 楼
风之落叶 [专家分:40] 发布于 2007-09-09 14:45:00
竟然有这么多的人回,谢谢了!
(不过现在我看来这题目有些弱智了)
23 楼
wtlrock [专家分:20] 发布于 2007-09-13 20:03:00
2楼的算法太过简单了吧,100的阶乘肯定超过了integer,longint等的范围.
所以要用人工模拟乘法的方法去做,并且要用到字符串.
具体的程序我现在没写好,过几天一定交上......
24 楼
wtlrock [专家分:20] 发布于 2007-09-13 20:05:00
强[em2]
25 楼
wtlrock [专家分:20] 发布于 2007-09-29 08:49:00
这是用C写的,要转换成Pascal也不难。
#include <stdio.h>
#include <stdlib.h>
/*计算任意一个100以内的数的阶乘*/
int turn(int x,int y[201]);
int multi(int x[201],int y,int z[201]);
int place(int m[201]);
int main()
{
int n,i,j,b,p;
long s,s10;
int a[201]={0},s1[201]={0};
printf ("input n:");
scanf("%d",&n);
if(n>100)printf("the number is out of range!");
else{
s=1;
if (n<=10){ /*当N小于10时,直接计算*/
for (i=1;i<=n;i++)s=s*i;
}
else{
s10=1;
for (i=1;i<=10;i++)s10=s10*i;
turn(s10,a);/*将S10存入数组a中*/
b=11;
while(b<=n){
multi(a,b,s1);
for(j=1;j<=200;j++){a[j]=s1[j];}/*进行模拟乘法计算*/
b++;
}
}
printf("result:");
if(s!=1)printf("%ld",s);
else {
p=place(s1);
for (i=p;i<=200;i++)printf("%d",s1[i]);/*输出结果*/
}
}
return 0;
}
int turn(int x,int y[201])/*转换函数*/
{
int i;
y[201]=0;
i=200;
while (x!=0){
y[i]=x % 10;
i--;
x=x/10;
}
}
int multi(int x[201],int y,int z[201]){/*乘法模拟函数*/
int place(int m[201]);
int y1,y2,cur1,cur2,cur,i;
int x1[201]={0},x2[201]={0};
y1=y/10;y2=y%10;
cur1=0;cur2=0;cur=0;
for (i=200;i>=place(x);i--){
x1[i]=(x[i]*y2+cur2)%10;
cur2=(x[i]*y2+cur2)/10;
x2[i-1]=(x[i]*y1+cur1)%10;
cur1=(x[i]*y1+cur1)/10;
}
x1[i-1]=cur2;x[i-2]=cur1;
for(i=200;i>=place(x2);i--){
z[i]=(x1[i]+x2[i]+cur)%10;
cur=(x1[i]+x2[i]+cur)/10;
}
z[i-1]=cur;
}
int place(int m[201]){/*定位函数*/
int i;
for(i=1;i<=200;i++){
if (m[i]!=0){
return i;
break;
}
}
}
我来回复