本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
15
输出样例:
1307674368000
该题的主要思想就是用一个数组来存放计算的数字,而每次的计算都不会超过计算机可运算的范围。
#define max 30000
void Print_Factorial ( const int N )
{
if(N<0) {
printf("Invalid input\n");
return ;
}
int number_[max]={0};
number_[0]=1;
int i,j,k;
for(i=2;i<=N;i++)//从 i=2开始乘,到N结束
{
int c=0;//用来记录i与数组里某一元素相乘的值
for(j=0;j<max;j++){//这里自己画一个数组,按照步骤填一下就能意会到了,类似自己手写乘法
int s=number_[j]*i+c;
number_[j]=s%10;
c=s/10;
}
}
for(k=max-1;number_[k]==0;k--);//找出最后一个数字,比如5231,找5的下标,需要倒着找到第一个不为0的元素
for(k;k>=0;k--)//倒着输出数组元素
printf("%d",number_[k]);
}
进行了优化修改的代码(是参考别人的)
#define max 30000
void Print_Factorial ( const int N )
{
if(N<0) {
printf("Invalid input\n");
return ;
}
int number_[max]={0};
number_[0]=1;
int i,j,k,t=0;
for(i=2;i<=N;i++)
{
int c=0;
for(j=0;j<=t;j++){
int s=number_[j]*i+c;
number_[j]=s%10;
c=s/10;
}
while(c){
number_[++t]=c%10;
c/=10;
}
}
for(k=t;k>=0;k--)
printf("%d",number_[k]);
}
这里就不过多解释了,倘若看懂第一个了,自己思考下就知道在那些地方做了优化。没看懂的话,可以留言~