题面
https://www.luogu.org/problemnew/show/P1009
解题思路:
数目过大,需要开一维数组进行进位处理。
(这样可以有效避免溢出问题)
代码如下
#include<stdio.h>
#include<math.h>
#define N 66
int main()
{
int s[N] = {0}, a[N] = {0};
int i,j,k,n,digit=1; //digit是数据位数 三位数 四位数什么的....
scanf("%d",&n);
a[0] = 1;
s[0] = 1;
if( n == 1)
printf("%d",a[0]); // 等于1则直接输出
for(k=2;k<=n;k++){ //大循环是阶乘位数从2开始
for(j=0;j<digit;j++)
a[j] *= k; //阶乘
for(j=0;j<digit;j++){ // 进位处理
if( a[j] *= k ){
a[j+1] += a[j]/10;
a[j] = a[j] % 10;
if( j == digit - 1) //j遍历到头了需要把digit加一位
digit++;}}
for(i=0;i<digit;i++) //累加操作
s[i] += a[i];
for(i=0;i<digit;i++){ //哪位有溢处是需要进位的
if( s[i] >= 10){
s[i+1] += s[i]/10;
s[i] = s[i]%10;
if(i == digit - 1)
digit++;
}
}
}
for(i=digit - 1;i>=0;i++) //打印结果!
printf("%d",s[i]);
}