[PTA]6-10 阶乘计算升级版

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]6-10 阶乘计算升级版相关的知识,希望对你有一定的参考价值。

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

函数接口定义:

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
  • 提交结果:

在这里插入图片描述

  • 源码:
#include <stdio.h>

#define MAXN 3000

void Print_Factorial(const int N);

int main()
{
    int N;

    scanf("%d", &N);
    Print_Factorial(N);
    return 0;
}

/* 你的代码将被嵌在这里 */
void Print_Factorial(const int N)   // 计算N!,模拟乘法运算
{
    if (N < 0)          // 负数没有阶乘
    {
        printf("Invalid input");
    }
    else if (N == 0)    // 0!为1
    {
        printf("%d", 1);
    }
    else               // 1!~1000!
    {
        // 1000!最多有2568位,定义MAXN为3000
        int num[MAXN] = { 0 };

        // maxIndex为最大数组下标,即2999
        int maxIndex = MAXN - 1;
        // curIndex为当前最小下标
        int curIndex = maxIndex;
        // 初始化最后一位值为1,其余为0
        num[maxIndex] = 1;

        // 计算N!,依次从1乘到N
        for (int i = 1; i <= N; i++)
        {
            // 进位
            int carry = 0;
            int flag = 0;

            for (int j = maxIndex; j >= curIndex; j--)
            {
                num[j] = num[j] * i + carry;

                // 进位值存在且中途已经使用过一次,则进位值重新赋值为0
                if (flag)
                {
                    carry = 0;
                }

                if (num[j] >= 10)
                {
                    // 向前的进位
                    carry = num[j] / 10;
                    // 当前位
                    num[j] %= 10;
                    // 当前下标到最小下标且还要进位,则curIndex--
                    if (j == curIndex)
                    {
                        curIndex--;
                    }
                    // 进位值存在则flag为1
                    flag = 1;
                }
            }
        }

        // 输出N!
        for (int i = curIndex; i <= maxIndex; i++)
        {
            printf("%d", num[i]);
        }
    }

    return 0;
}

以上是关于[PTA]6-10 阶乘计算升级版的主要内容,如果未能解决你的问题,请参考以下文章

[PTA]6-10 阶乘计算升级版

PTA题目集导航

6-10 阶乘计算升级版(20 分)

PTA之简单阶乘计算

PTA 7-6 计算阶乘和 (10分)

[PTA]6-8 简单阶乘计算