6-10 阶乘计算升级版 (20 分)

#include <stdio.h>

void Print_Factorial ( const int N );

int main()

{

int N;

scanf("%d", &N);

Print_Factorial(N);

return 0;

}

/* 你的代码将被嵌在这里 */

打印N!的值,涉及到大数运算:加法和乘法。

解决思路为模拟手算乘法的过程,用数组存储并运算得到结果。ProjectEuler中有一道类似的题目:题目13:找出100个50位数之和的前十位数字。

阶乘代码如下:

void Print_Factorial ( const int N )

{

if(N<0)

{

printf("Invalid input");

return ;

}

int num[3000]={1};

int up=0;//记录当前进位值

int pos=0;//记录当前最高位所在的下标

for(int i=1;i<=N;i++)

{

for(int j=0;j<=pos;j++)

{

int tem=num[j]*i+up; //更新当前位置上的数

num[j]=tem%10;

up=tem/10;

}

while(up!=0)//位数要增长

{

num[++pos]=up%10;

up/=10;

}

// for(int d=pos;d>=0;d--)

// {

// printf("%d",num[d]);

// }

// printf("\n");

}

// printf("\n");

for(int i=pos;i>=0;i--)

{

printf("%d",num[i]);

}

}