微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HDU 1042 N!(大数)

N!

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)


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
 
/************************************************************************/

题意:题目意思,相信大家都能看懂,就是给你一个N,要你计算N的阶乘(N!)

解题思路:因为N!的值已经远远超过了int的范围,所以此题无疑要用到大数操作,而大数操作其实就是一个模拟计算过程的操作,亦是一种字符串操作,当然,若是会用Java的也可以不用如此麻烦,但是Java一般耗时比较长,不过用得好的话还是挺不错的。

当然,在此,我仅仅介绍一下c++的方法,Java可以搜一下大数,还是比较方便的

比如我们已经计算出8!,要计算9!的过程如下:


具体的看代码,若有不明白之处,可以提出

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 50005;
const int inf = 1000000000;
const int mod = 1000000007;
int s[N];
int main()
{
    int n,i,j,k,m,c;
    while(~scanf("%d",&n))
    {
        memset(s,sizeof(s));
        s[0]=k=1;c=0;
        for(i=2;i<=n;i++)
        {
            for(j=0;j<k;j++)
            {
                m=s[j]*i+c;
                s[j]=m%10;
                c=m/10;
            }
            while(c!=0)
            {
                s[k++]=c%10;
                c/=10;
            }
        }
        for(i=k-1;i>=0;i--)
            printf("%d",s[i]);
        puts("");
    }
    return 0;
}
菜鸟成长记

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐