N!

来源:互联网 发布:魔镜软件下载 编辑:程序博客网 时间:2024/05/16 19:20

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
123
 

Sample Output
126

以前在NYOJ做过一个大数阶乘的问题,但是发现原来的代码在航电上会出现超时现象,参考别人的代码发现控制位可以得到更好的效果,更加省时。

//数组开的太小 用 Big  Number算出来10000的阶乘位数为35660,开到40000足够。

#include<stdio.h>#include<string.h>#define MAX 40000int 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 stubScanner 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;}                 


0 0
原创粉丝点击