记录--进行大数字的阶乘(直接给代码)

//这是做题时写的代码,做个记录,只是计算比如5000!的时候要花点时间

#include <iostream>
#include <vector>
using namespace std;

vector<int> get_mult_number(vector<int>num1, int n) //参数传递一个可变数组和一个乘数
{
    //这个函数拿来做乘法没有问题,写一个做加法的函数
    //核心问题在于,这个n我们手写过程当中是单独一位,但是代码中会变成多位,如何处理这个错位相加的问题
    // 现在细化这个函数,用于计算n多于1位的情况
    /*cout << "num1 : ";
    for (auto x : num1) {
        cout << x;
    }
    cout << endl;*/
    vector<int> mult_number;//保存最终的结果
    int temp;//这个变量保存每位和n的乘积
    int x = 0;//这个变量保存进位数
    int y;//这个变量保存加数

    for (int i = 0; i < num1.size(); i++) {
        //cout << "当前做乘法的数 " << num1[i] << endl;
        //cout << "当前的进位数 " << x << endl;
        temp = num1[i] * n;
        //cout << "temp " << temp << endl;
        y = temp + x;
        //cout << "y " << y << endl;
        if (y >= 10) {//乘数大于0且有进位的情况
            temp = y % 10;//用temp保存最后做位数的数
            //cout << "结果位 " << temp << endl;
            x = y / 10;
        }
        else {
            x = 0;//否则没有进位
            temp = y % 10;//用temp保存最后做位数的数
            //cout << "结果位 " << temp << endl;
            x = y / 10;
        }
        mult_number.push_back(temp);
    }
    if (x > 0)
        mult_number.push_back(x);

    /*for (auto x : mult_number) {
        cout << x;
    }
    */
    return mult_number;
}

vector<int> get_add_number(vector<int>num1, vector<int> num2, int n)
{//这个函数处理加法运算,错位加法那种, n代表进位多少个
    //规定num2是需要错位的数,这样,无论多少个数相加都可以按顺序来做
    vector<int> sum; //保存和的数组
    int i = n;
    int temp; //这个变量保存每位相加的数
    int x = 0;//这个变量保存进位,最初为0
    int y; //保存最终的和并判断是否进位的依据
    for ( i = 0; i < n; i++) {
        sum.push_back(num1[i]);//第一个加数的最后一位直接相加
    }
    //cout << "错位之后的i " << i << endl;
    //cout << "num1.size " << num1.size() << endl;
    for (; i < num1.size(); i++) {
        //cout << "当前i " << i << endl;
        temp = num1[i] + num2[i - n];
        //cout << "做加法的两个数 " << num1[i] <<"  " << num2[i - 1] << endl;
        y = temp + x;
        if (y >= 10) {
            x = y / 10;
            temp = y % 10;
        }
        else {
            x = 0;
            temp = y;
        }
        sum.push_back(temp);
    }
    //cout << "最后的i " << i << endl;
    i -= n;
    for (; i < num2.size(); i++) {
        //cout << "当前num2【i】 " << num2[i] << endl;
        temp = num2[i] + x;
        if (temp >= 10) {
            x = temp / 10;
            temp = temp % 10;
        }
        else {
            x = 0;
        }
        sum.push_back(temp);
    }
    if (x > 0) {
        //cout << x << endl;
        sum.push_back(x);
    }
    return sum;
}


vector<int> get_fac_number(vector<int> num, int n)
{//计算一个数和n的阶乘
    //这里的n多于1位
    vector<int> finalnum;
    vector<int> tempnum1;
    int x = n % 10;
    n /= 10;
    int i = 1;
    finalnum = get_mult_number(num, x);
    while (n > 0) {
        x = n % 10;
        tempnum1 = get_mult_number(num, x); //乘法
        finalnum = get_add_number(finalnum, tempnum1, i);//加法
        n /= 10;
        i++;//错位数++
    }
    return finalnum;//这个结果是某个数和n(多位数)相乘的结果
}


void print_factorial(const int n)
{
    vector<int> finalnum;
    finalnum.push_back(1);//表示从1开始乘
    if (n <= 0)
        cout << "Invalid input" << endl;
    else {
        for (int i = 1; i <= n; i++) {
            finalnum = get_fac_number(finalnum, i);
            //最开始 1 * 1
            // 而后1*2, 2 * 3, 6 * 4,,,
            //
        }
    }
    reverse(finalnum.begin(), finalnum.end());
    for (auto c : finalnum) {
        cout << c;
    }
}

int main()
{
    print_factorial(5000);
    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值