【追梦】PTA-基础编程题目集(6-10)阶乘计算升级版

题解(向下滑动有注释及题目)

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

上一篇:spring security 学习三-rememberMe


下一篇:Console 口配置 Telnet 登录方式典型配置指导