欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阶乘计算升级版 (20 分)

程序员文章站 2022-06-07 15:15:47
...

我牛哥教我的哦-/-

先看看算法吧

最下面是程序,里面有注释
阶乘计算升级版 (20 分)

题目 本题要求实现一个打印非负整数阶乘的函数。

函数接口定义:

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


void Print_Factorial(const int N)
{
    if (N < 0)
        printf("Invalid input");
    else
    {
            //为什么定义a是4000呢,因为1000!正好是4000位左右,定义四百万也没事
        int a[4000] = {0};//a数组就是放阶乘值的地方,是从后向前放的
        int s;      //放每个数字每位乘改乘的阶乘数的,具体看 手写图的s
        int c = 0;  //c是 “每个数字每位乘改乘的阶乘数的”  进位,比如42*8 (换下一行)
        a[0] = 1;   //分解一下就是2*8=16;最后一位(6)就是结果的个位数字,而1就是进位的数(此程序中用c来表示);(换下一行)
        int i, j;   //现在就是各位求完了,进位也知道了;然后就是4*8=32,咱们知道还有上一次的进位,所以32+1=33;最后的结果就是336;
                    //这个就是这个算法的核心思想
        for (j = 2; j <= N; j++)  //j是控制阶乘的大小,即从1乘到j -------//a[0]就相当于了乘阶的1;所以j从2开始就可以了(从1也没事)
        {
            c = 0;        //每次把进位重置为0
            for (i = 0; i < 4000; i++)
            {
                s = a[i] * j + c;      //s就是数字的每位数乘当前阶乘的结果,s每次都不一样
                a[i] = s % 10;          //这个就是存的当前最新的数第(i+1)位的单个数字
                c = s / 10;              //c就是进位咯
            }
        }
        for (i = 4000 - 1; i >= 0; i--)   //因为4000是随便定义的,所以a数组中最后不一定有多少个0;要把0去掉再从后向前输出
            if (a[i] != 0)  
                break;
        for (; i >= 0; i--)
        {
            printf("%d", a[i]);
        }
    }
}