C++实现——大数阶乘

/*
大数的阶乘: 给定一个整数n,将其阶乘n!值存入到一个数组中。
*/

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
//n代表要求的N值 k代表最后结果一共有多少位 R代表最后的结果集合
void factorial(int n,int &k,vector<string>&R)
{
    vector<long> a(10000);
    int i, j, l, c, m = 0;
    a[0] = 1;
    for (i = 1; i <= n; i++)
    {
        c = 0;
        for (j = 0; j <= m; j++)
        {
            a[j] = a[j] * i + c;
            //以10000为进制单位
            c = a[j] / 10000;
            a[j] = a[j] % 10000;
        }
           //若最后有进位则扩展一位
        if (c>0) {
            m++; a[m] = c; 
        }
    }
    //k存的是结果总共的位数
    k = m * 4 + log10(a[m]) + 1;    
    char s[20];
    //构造结果集
    vector<string> res;
    sprintf(s,"\n%ld", a[m]);
    res.push_back(s);
    res[0] =to_string (a[m]);
    for (i = m - 1; i >= 0; i--){
        //格式化输出不满四位的左侧补0
        sprintf(s,"%4.4ld", a[i]);
        res.push_back(s);
    }
    //将结果统计到结果集里面
    R.resize(m + 1);
    for (int i = 0; i < m + 1; i++){
        R[i] = res[i];
    }
    return;
}


int main(){
  int n;
    while (cin >> n, n){
        int k = 0;
        vector<string> res;
        //函数返回两个结果一个是多少位,一个是字符串集合
        factorial(n, k,res);

        //打印输出结果
        cout << "**************************************" << endl;
        cout << n << "的阶乘一共有" << k << "位" << endl;
        for (auto a : res){
            cout << a;
        }
        cout << endl<<"**************************************" << endl;

    }

    return 0;
}

你可能感兴趣的:(C++实现——大数阶乘)