#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;
/* 算法很水的,不过改良方向大概就是每四位算一个之类的东西了。。参考麦森数 */
int getWeishu(int n)
{
double weishu = 0;
for(int i = 2; i <= n; i++)
{
weishu += log10(i);
}
return (int)weishu + 1;
}
int main()
{
int digit[40000] = {0};
digit[0] = 1;
int n;
cin >> n;
int weishu = getWeishu(n);
for(int i = 2; i <= n; i++)
{
for(int j = 0; j < weishu + 1; j++)
{
digit[j] *= i;
}
if(i % 2 == 0)
{
for(int j = 0; j < weishu + 1; j++)
{
if(digit[j] >= 10)
{
int ten = digit[j] / 10;
digit[j + 1] += ten;
digit[j] %= 10;
}
}
}
}
for(int j = 0; j < weishu + 1; j++)
{
if(digit[j] >= 10)
{
int ten = digit[j] / 10;
digit[j + 1] += ten;
digit[j] %= 10;
}
}
int outline = weishu;
if(weishu % 50 != 0)
outline = (weishu / 50 + 1) * 50;
outline -= 1;
for(int i = outline; i >= 0; i--)
{
printf("%d", digit[i]);
if(i % 50 == 0)
printf("\n");
}
return 0;
}
10000以内的阶乘
最新推荐文章于 2021-11-05 15:31:39 发布