大数的阶乘

首先要确定这个数的阶乘需要开多大的数组,可以用Stirling公式。

输入不超过10000的正整数,计算n!的具体值。

#include<iostream>
#include<math.h>
using namespace std;
const int maxn=50000;
int main(){
    int n,s,k,c;
    int f[maxn+1];
    while (cin>>n)
    {
        memset(f,0,sizeof(f));
        f[0]=1;
        for(int i=1;i<=n;i++){
            c=0;
            for(int j=0;j<=maxn;j++){
                s=f[j]*i+c;
                c=s/10;
                f[j]=s%10;
            }
        }
        for(k=maxn;k>=0;k--)
            if(f[k]!=0)  break;
        for(int j=k;j>=0;j--)
            cout<<f[j];
        cout<<endl;

    }
    return 0;
}

我们发现f[i]里面只有1个数字,但是f[i]是int型的,能存9位数,这样不仅速度加快,开销也减小很多。

#include<iostream>
#include<iomanip>
using namespace std;
const int maxn=20000;
int main(){
    int n,s,k,c;
    int f[maxn+1];
    while (cin>>n)
    {
        memset(f,0,sizeof(f));
        f[0]=1;
        for(int i=1;i<=n;i++){
            c=0;
            for(int j=0;j<=maxn;j++){
                s=f[j]*i+c;
                f[j]=s%100000;
                c=s/100000;
            }

        }
        for(k=maxn;k>=0;k--)
            if(f[k]!=0)  break;
        cout<<f[k];
        for(int j=k-1;j>=0;j--){
            cout<<setw(5)<<setfill(‘0‘)<<f[j];

        }
        cout<<endl;
    }
    return 0;
}
时间: 2024-12-14 18:44:45

大数的阶乘的相关文章

链表实现大数类阶乘

链表实现大数阶乘 题目 大数运算--计算n的阶乘 (n≥20). 基本要求 (1)数据的表示和存储: ①累积运算的中间结果和最终的计算结果的数据类型要求是整型--这是问题本身的要求. ②试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值. (2)数据的操作及其实现: 基于设计的存储结构实现乘法操作,要求从键盘上输入n值:在屏幕上显示最终计算结果. 思路 建立大数类(其实好像想麻烦了),不过面向对象的方法还挺好写的,重载乘法,这里我搞麻烦了,一开始重载了大数乘法,其实弄一个大数乘整数就

大数的阶乘的准确值

输入不超过1000的正整数你,输出其阶乘的准确的值.求阶乘大家都会,用递归就可以搞定,开销会比较大.阶乘增长是很快的,c语言中int值的范围大小与电脑位数n有关.整数区间为[-2^(n-1),2^(n-1)).在32位pc机上,其最大值为2^31,分析该题假如输入1000!是个很大的数,远远超过int的范围.可以用一个4000个元素的数组保存.从低位到高位依次保存在数组从小到大的角标元素中.代码如下: <pre name="code" class="cpp"&

hdu 1042 N!(大数的阶乘)

N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 55659    Accepted Submission(s): 15822 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one

2017/7/31-zznu-oj-问题 B: N! 普拉斯 -【求大数的阶乘-ll存不下-然后取尾零的个数输出-暴力模拟】

问题 B: N! 普拉斯 时间限制: 1 Sec  内存限制: 128 MB提交: 114  解决: 35[提交] [状态] [讨论版] [命题人:admin] 题目描述 在处理阶乘时也需要借助计算器. 在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下:  宝儿姐一直在思考一个问题,N!末尾究竟有多少个0?我们假设N!末尾有k个0,请按照规则打印k. 输入 输入一个正整数n(n< 50) ,输入以EOF结尾. 输出 我们假设N!末尾有k个0,请按照规则打印k,数字之间间隔3列0.

hdu1042 N!(大数求阶乘)

N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 94583    Accepted Submission(s): 28107 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in on

高精度,大数的阶乘

求1000! #include <bits/stdc++.h> using namespace std; #define Maxn 1000 int A[Maxn]; int main(){ int i,j,n; scanf("%d",&n); memset(A,0,sizeof(A)); A[0] = 1;//第一位要设置为1,否则结果就全是0了 for(int i = 2; i <= n; i++){ int c = 0; for(j = 0; j <

HDU1042 N! 大数的阶乘

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 由于数字特别大, 所以用数组来模拟. 经测试, 数组大小开50000 可过. 附AC代码, 欢迎大神指点~ #include <cstdio>#include <cstring> const int maxn = 50000 + 100;int a[maxn];void solve(int n){ memset(a, 0, sizeof(a)); a[0] = 1; int p

大数阶乘(C/C++)

高精度的运算在Java中是很容易实现的,就像 a + b Problem 一样,因为Java提供了相应的类库和API:但是在 C/C++ 当中就没有那么现成的类和API来让你调用了.本着“自己动手,丰衣足食”的Coder精神,还是自己上吧.让我们一起看看如何使用 C/C++ 来进行大数的阶乘吧. /* *From:<算法竞赛入门经典>――刘汝佳 *Author:YQ_beyond *Date:2015.03.29 */ /* C++当中高精度运算 */ #include<iostream

Java大数练习第一弹

今天要多刷java大数,争取以后轻松水掉大数题~ hdu 1002 大数相加 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 [代码] import java.util.*; import java.math.BigInteger; public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); int n=in.next