洛谷刷题1:阶乘之和(P1009)
这其实属于高精度问题
如果数字很小的话,这个问题根本不算个问题,但是,如果要算的阶乘是20往上的阶乘,数字将会非常庞大,大大超出int型的-2147483647~2147483647
因此,我们需要用到数组去存每一位
而计算的过程,不能简单地用乘法,而是利用各位小学就学过的内容,竖式计算
所谓竖式计算,形如
36
*8
——
288
其中涉及每一位的计算与进位
而我们的代码也是这个思路
#include<iostream>
using namespace std;
int a[2000];
int c[2000];
void shushichengfa(int a[], int n)//这里我们的竖式乘法是在算出n-1的阶乘的基础上算n的阶乘
{
int x = 0;
for (int i = 1; i <= 1000; i++) {
a[i] = a[i] * n + x;
x = a[i] / 10;//这里的x就是为了处理进位问题,如果a[i]此时超出了10,那么会将超出的部分加到下一位
a[i] %= 10;//a[i]保留个位的数字
}
}
void shushijiafa(int a[], int c[])//竖式加法类似
{
int x = 0;
for (int i = 1; i <= 1000; i++)
{
c[i] += a[i] + x;
x = c[i] / 10;
c[i] %= 10;
}
}
int main()
{
int n;
cin >> n;
a[1] = 1;//先将第一位初始化
for (int i = 1; i <= n; i++)
{
shushichengfa(a, i);
shushijiafa(a, c);
}
bool flag = 0;
for (int i = 1000; i >= 1; i--)
{
if (c[i] != 0) flag = 1;
if (flag) cout << c[i];
}
return 0;
}

浙公网安备 33010602011771号