大数的阶乘
其实就只是10000以内的数的阶乘。一开始想到了用数组辅助的方法(因为50的阶乘就超过了long long int了),然而是我太年轻呀,20000位的数组都没表示完,最后换了a[200001],20万的数组过了。太可怕了
#include<iostream>
#include<string>
#include <algorithm>
using std::endl;
using std::cin;
using std::cout;
int main()
{
//大数的阶乘
int num, digit = 1, a[200001]; //digit代表值有多少位
cin >> num;
a[0] = 1;
for (int i = 2; i <= num; i++) {
int c = 0; //c代表的是进位
for (int j = 0; j < digit; j++) { // 保证从a[0]到a[digit-1],是之前赋值过的
int temp = a[j] * i + c;
a[j] = temp % 10;
c = temp / 10;
}
while (c != 0) {
a[digit] = c % 10;
c = c / 10;
digit++;
}
}
for (int i = digit - 1; i >= 0; i--) {
cout << a[i];
}
}
没啥思想在里面,就是竖式乘法。注意:每次乘完后可能不止进位1位(100×99!时),也可能不进位(3×2!时)。
i
× a[digit-1]a[digit-2]...a[1]a[0]
________________________________________
* * * *
* * * * * *
* * * * * * * * *
————————————————————————————————————————
a[digit]a[digit-1]a[digit-2]...a[1]a[0]