加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

N!

发布时间:2020-12-14 03:32:05 所属栏目:大数据 来源:网络整理
导读: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! ? Inpu

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,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,c,d,ans,a[10002];
        memset(a,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;
}
                 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读