//这是做题时写的代码,做个记录,只是计算比如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;
}