N!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 52207 Accepted Submission(s): 14737
Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1 2 3
Sample Output
1 2 6
以前在NYOJ做过一个大数阶乘的问题,但是发现原来的代码在航电上会出现超时现象,参考别人的代码发现控制位可以得到更好的效果,更加省时。
//数组开的太小 用 Big Number算出来10000的阶乘位数为35660,开到40000足够。
#include<stdio.h>
#include<string.h>
#define MAX 40000
int main(){
int m,a[MAX];
while(scanf("%d",&m)!=EOF)
{
int i,j,digit=1,t=0,s=0;
memset(a,0,sizeof(a));
a[0]=1;
for(i=2; i<=m; i++)
{
for(j=1; j<=digit; j++)
{
s=a[j-1]*i+t;
a[j-1]=s%10;
t=s/10;
}
//求位数
while(t)
{
a[++digit-1]=t%10;
t/=10;
}
}
for(i=digit-1; i>=0; i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}
用JAVA解决大数阶乘问题:
import java.math.*;
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
/*这个语句是java语句 这句话在java里面的意思是
* 新建一个系统默认输入(就是键盘)的对象,
* 然后就可以用sc.next()等等语句进行输入了.*/
/*System.in 的意思是 应用接收用户手动输入*/
while(in.hasNext()){
/*hasNext()是Scanner类的一个方法,
}
判断是否有输入,有输入项,a .hasNext()为true,
没有输入项,a .hasNext()为false。*/
BigInteger sum = new BigInteger("1");
int i,m;
m=in.nextInt();
for(i=2; i<=m; i++){
sum=sum.multiply(BigInteger.valueOf(i));
}
System.out.println(sum);
}
}
}
//精简版:
import java.math.*;
import java.util.*;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner (System.in);
while(in.hasNext()){
BigInteger sum=new BigInteger("1");
int i,m;
m=in.nextInt();
for(i=2; i<=m; i++){
sum=sum.multiply(BigInteger.valueOf(i));
}
System.out.println(sum);
}
}
}
/*
数组存储10000位方式解大数阶乘
*/
#include<cstdio>
#include<cstring>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,c,d,ans,a[10002];
memset(a,0,sizeof(a));
a[0]=1;
for(i=2,d=1; i<=n; i++)
{
for(j=0,c=0; j<d; j++)
{
ans=a[j]*i+c;
a[j]=ans%10000;
c=ans/10000;
}
while(c)
{
a[d++]=c%10000;
c/=10000;
}
}
j=d;
while(a[j]==0) j--;
printf("%d",a[j]);
for(i=j-1; i>=0; i--)
printf("%04d",a[i]);
printf("\n");
}
return 0;
}