题目描述:
-
输入一个正整数N,输出N的阶乘。
-
输入:
-
正整数N(0<=N<=1000)
输出:
-
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
样例输入:
-
4 5 15
样例输出:
-
24 120 1307674368000
提示:
来源:
- 2006年清华大学计算机研究生机试真题
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
int a[100001];
int main()
{
int n;
while (scanf("%d",&n)!=EOF) {
if (n==0)
cout << "1\n";
else {
int i,j,k=1;
memset(a, 0, sizeof(a));
a[0]=1;
for (i=1; i<=n; i++)
{
for (j=0; j<=k; j++)
a[j]*=i;
for (j=0; j<=k; j++)
if (a[j]>9)
{
a[j+1]+=a[j]/10;
a[j]%=10;
if (j+1==k)
k++;
}
}
for (i=k;i>=0;i--)
if (a[i])
break;
for (j=i; j>=0; j--)
printf("%d",a[j]);
printf("\n");
}
}
return 0;
}
这个程序是学长介绍的,简单易懂。呵呵,继续努力哦。
下面这个程序更加高效:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int i,j,n,lenth,carry,tempt;
while(scanf("%d",&n)!=EOF){
int s[7201]={1};
lenth=1;
//lenth 记录数组的实际运用长度
for(i=2;i<=n;i++)
{
carry=0;
for(j=0;j<lenth;j++)
{
tempt=s[j]*i+carry;
carry=tempt/100000;
s[j]=tempt%100000;
}
while(carry)
{
s[lenth++]=carry%100000;
//如果有进位 数组运用的实际长度+1
carry/=100000;
}
}
j=lenth-1;
printf("%d",s[j--]);
//注意看好这一步!最高位的前置0不能输出,其他的前
//置0要输出
for(;j>=0;j--)
printf("%05d",s[j]);
printf("\n");
}
return 0;
}
好好学习!
Java版本:
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args)
{
Scanner cin=new Scanner (System.in);
while(cin.hasNext())
{
BigInteger a=BigInteger.valueOf(1);
int b=cin.nextInt(),i;
for(i=1;i<=b;i++)
{
a=a.multiply(BigInteger.valueOf(i));
}
System.out.println(a);
}
}
}