大数阶乘(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>
#include<cstring>
#include<cstdio>
using namespace std;

const int maxn = 3000;
int res[maxn];

int main()
{
    int i, j, n;
    while(1)
    {

        scanf("%d",&n);
        memset(res,0,sizeof(res));
        res[0] = 1;

        int cut = 1;
        for(i = 1 ; i <= n ; i++)
        {
            int cnt = 0;
            for(j = 0;j < cut; j++)
            {
                int s = res[j] * i + cnt;
                res[j] = s % 10;
                cnt = s / 10;
            }
            for(; cnt != 0; j++)
            {
                int s = res[j] * i + cnt;
                res[j] = s % 10;
                cnt = s / 10;
                cut ++;
            }
        }

        //for(j = maxn - 1; j >= 0; j--) if(res[j]) break;
        for(i = cut - 1; i >= 0; i--) printf("%d",res[i]);
        printf("\n");
    }
    return 0;
}
时间: 2024-11-06 04:56:27

大数阶乘(C/C++)的相关文章

大数阶乘(c语言)

大数阶乘.代码比较简单. #include<stdio.h> #include<string.h> #define MAXN 25000 // 如果你的阶乘N比较大,建议大一点 int result[MAXN]; int main() { int i,j,n; scanf("%d",&n); // memset函数的作用将某一段内存设置成指定的值 // 参数1:内存首地址 参数2:指定的值 参数3:内存大小 memset(result,0,sizeof(

精度计算-大数阶乘

精度计算-大数阶乘 本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个long a[]数组中. 我们的思路是把每4位数看做数组的一个元素来存储,例如:个.十.百.千存在a[0],万.十万.百万.千万存在a[1]以此类推. 我们用10的阶乘来模拟一下求结果大于4位数阶乘的过程,9的阶乘为362880,而10的阶乘为9的阶乘乘以10,在计算完9的阶乘时a[0] = 2880,a[1]=36,因为362880*10 = (36*10+

NYON28大数阶乘

大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 30414093201713378043612608166064768844377641568960512000000000000 解析:在开数组的时候一定要开大一点,我开的小怎么都不能通过,气死我了,

hdu 1042 N!(大数阶乘,转化为100000这样的比较大的进制)

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

nyoj___大数阶乘

http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 3041409320171337804361260816606476884437764156896

#转 大数阶乘算法

大数阶乘算法 大数阶乘算法 前几天朋友问我一个问题:“10000的阶乘怎么算?”当时我就有点懵,“10000”这个数字太大了,无论用什么数据类型保存结果都会溢出.这可怎么办呢?一时间束手无策.然后被一顿鄙视.后来经朋友的提醒,才恍然大悟,终于知道怎么实现了,原来是使用数组来模拟数字,这样无论结果数字有多大,只要数组的长度够长就能表示出来,用这个办法可以进行大数据的运算.看起来还是挺有用的.我把它用程序实现出来,如果有用到的地方还可以借鉴一下.(最起码还可以拿来鄙视别人^_^)首先定义一个足够长的

斯特林公式(计算大数阶乘)

#include <iostream> #include <cstdio> #include <cmath> #define PI 3.1415926535898 #define e 2.718281828459 using namespace std; ///斯特林 ///n!=sqrt(2*PI*n)*pow(n/e,n) int main() { int n;cin>>n; while(n--){ long long m; scanf("%l

【大数阶乘】NYOJ-28

大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 30414093201713378043612608166064768844377641568960512000000000000 [代码] 1 //NYOJ-28 大数阶乘 2 //直接开足够大的数组

NYOJ28 大数阶乘

这是做的第一道大数乘法题,之前一道腾讯校招试题也用的是大数,不过是大数加法,并且在做这道题的时候发现了一种很好的处理数位的方法. 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 304140932017133780436126081660647688