题解(向下滑动有注释及题目)
void Print_Factorial ( const int N )
{
int num[3000];//数组中的每一个位置存储的都是0~9之间的数
int length;//数组里实际存储的元素个数
int i,j;
int jinWei=0;
int temp;
if(N<0)
printf("Invalid input\n");
if(N==0)
printf("1\n");
num[0]=1;
length=1;
if(N>0)
{
for(i=2;i<=N;i++)
{
jinWei=0;
for(j=0;j<length;j++)
{
temp=i*num[j]+jinWei;
num[j]=temp%10;
jinWei=temp/10;
}
while(jinWei!=0)
{
num[length]=jinWei%10;
jinWei=jinWei/10;
length++;
}
}
for(i=length-1;i>=0;i--)
{
printf("%d",num[i]);
}
}
}
注释:
先来说说乘法吧,假设15乘以3,我们是不是得让5*3,然后再让10*3;最后相加起来,但是呢,我们这里用的是数组存储数字, 数组的下标都有唯一的权,例如num【0】是个位数,即存的是5,num【1】是十位数存的是1。回想下乘法运算的过程,乘数一的每一位都要乘以乘数二,将数组里的数字分别乘以3,是不是我们要的效果呢,我们来看一下,5*3=15,我们的num数组每一位都是0~9之间的数,但这里超出了,那我们该怎么办呢,对的,想想乘法,是不是要加上一个进位,我们在这里定义一个变量jinWei=15/10=1,那么 num【0】到底该存储什么呢,当然是留下本位,即15%10=5了,然后num【1】=1*3+jinWei=4,最后结果是45,怎么样,是这个理吧!
好了,到了这里,假设我们的十位也有进位,我想,读者也知道该怎么办了吧,当然,我们的进位不一定是个位数,所以我们还要在处理一下,这就是while循环的作用了。
这个具体思想我们知道了,那么接下来找个例子走走吧
还是那句话,理解代码的最好方法就是跟着程序找个例子走一遍,就像数学的代入法一样
就拿15!来举例吧,
进入外循环,
i=2, jinwei=0
进入第一个内循环
…j=0;j<length=1;
…temp=num[0]*i+jinWei=1*2+0=2;
…num[0]=temp%10=2%10=2;
…jinWei=temp/10=2/10=0;
…j=1;退出内循环
jinWei=0,不进入while循环;
i=3;
啊这,好麻烦,算了算了,我们直接看while循环吧,当然,只有我们目前的最高位产生进位时,才会进入while循环,假设jinWei=150/10=15;
进位不等于0,进入while循环
假设此时length=10吧,
num[l0]=15%10=5;
jinWei=jinWei/10=1;
length++
继续循环,
num[11]=1%10=1;
jinWei=1/10=0;
length++;
退出while循环;
题目
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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