4-10 阶乘计算升级版

本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:

void Print_Factorial ( const int N );

其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
程序样例

#include 
void Print_Factorial(const int N);
int main()
{
    int N;
    scanf_s("%d", &N);
    Print_Factorial(N);
    getchar();
    getchar();
    return 0;
}
/* 你的代码将被嵌在这里 */
void Print_Factorial(const int N)
{
    int i;
    int sum=1;
    if (N >= 0&&N<=12)
    {
        if (N == 0)
            sum = 1;
        else
         for (i = 1; i <= N; i++)
            sum = sum*i;
        printf("%d\n", sum);
    }
    else if (N > 12 && N <= 1000) 
    {
        int num[3000] = { 0 }; //用于存储最终结果数据
        int k = 1;  //位数
        int n = 0;  //进位
        int i, j, x, temp;
        num[0] = 1;     //结果初始化1
        for (i = 2; i <= N; i++)  //从2开始阶乘 数据结果逆序存放
        {
            for (j = 0; j < k; j++)  //将临时结果的每一位与阶乘数值相乘
            {
                temp = num[j] * i + n; // 每一位分别作阶乘
                num[j] = temp % 10;    //更新末位数值
                n = temp / 10;   //更新进位数值
            }
            while (n != 0)
            {
                num[k] = n % 10;  //更新进位数据
                n /= 10;
                k++;     //更新进位位数
            }
        }
        for (x = k - 1; x >= 0; x--)   //数据输出
            printf("%d", num[x]);
    }
    else 
        printf("Invalid input");
}

这个题目提交了好多次,开始以为是基础的阶乘题目,但是提交后发现永远是部分正确,只得15分,起初以为是输出printf函数的问题,修改后还是部分正确,最终查找了几个CSDN博客才找到源码,水平较渣,源码看了好久才看明白。
这个问题中,由于1000!大约有3000位数值,所以只能通过构造数组的形式来实现对结果的存储。
int 型占在32位上位机上占据32个字节,所以最大值时2的32次方=4294967296(无符号),带符号再除以2,负数比正数多一个,便得出取值范围-2147483648~+2147483647。又由于13!=6 227 020 800,已经超出了最大值,所以在计算13以后的阶乘时采用数组方式解决问题。

你可能感兴趣的:(4-10 阶乘计算升级版)