当前位置: 首页 > article >正文

函数题 6-10 阶乘计算升级版【PAT】

文章目录

  • 题目
    • 函数接口定义
    • 裁判测试程序样例
    • 输入样例
    • 输出样例
  • 题解
    • 解题思路
    • 完整代码
    • AC代码

编程练习题目集目录

题目

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

函数接口定义

void Print_Factorial ( const int N );

  其中N是用户传入的参数,其值不超过 1000 1000 1000。如果 N N N 是非负整数,则该函数必须在一行中打印出 N ! N! N! 的值,否则打印 “ I n v a l i d i n p u t ” “Invalid input” Invalidinput

裁判测试程序样例

#include <stdio.h>
void Print_Factorial(const int N);
int main()
{
	int N;
	scanf("%d", &N);
	Print_Factorial(N);
	return 0;
}
/* 你的代码将被嵌在这里 */

输入样例

15

输出样例

1307674368000

题解

解题思路

  首先判断传入函数的数字是否小于 0 0 0,如果小于 0 0 0,则输出 “ I n v a l i d i n p u t ” “Invalid input” Invalidinput;如果是 0 0 0 或者 1 1 1 则直接输出 1 1 1 即可;如果在 2 − 12 2-12 212 之间则可以直接相乘,输出即可;如果大于 12 12 12 则变量无法保存数据,需要使用数组来保存,将结果以数组形式输出即可。

完整代码

#include <stdio.h>

void Print_Factorial ( const int N );

int main()
{
    int N;

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

/* 你的代码将被嵌在这里 */
void Print_Factorial(const int N)
{
    if (N < 0)
    {
        printf("Invalid input\n");
    }
    else if (N < 2)             // 0和1的阶层为1
    {
        printf("1\n");
    }
    else if (N > 1 && N < 13)   // 12及之前都可以用long int型表达
    {
        int i = 2;
        long int sum = 1;
        for (i; i <= N; i++)
        {
            sum *= i;
        }
        printf("%ld\n", sum);
    }
    else
    {
        int Num[3000] = { 0 };  // 确保保存最终运算结果的数组足够大:1-9相乘最多有9位,10-99相乘最多有2*90=180位,100-999相乘最多有3*900=2700位,1000是4*1=4位,总计2893,最好数组取大一下
        int i, j, k, n;
        k = 1;                  // 位数
        n = 0;                  // 进位
        Num[0] = 1;             // 将结果先初始化为1
        int temp;               // 阶乘的任一元素与临时结果的某位的乘积结果
        for (i = 2; i <= N; i++)
        {
            for (j = 0; j < k; j++)
            {
                temp = Num[j] * i + n;      // 相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
                Num[j] = temp % 10;         // 更新临时结果的位上信息
                n = temp / 10;              // 看是否有进位
            }
            while (n)                       // 如果有进位
            {
                Num[k] = n % 10;            // 新加一位,添加信息。位数增1
                k++;
                n = n / 10;                 // 看还能不能进位
            }
        }
        for (i = k - 1; i >= 0; i--)
        {
            printf("%d", Num[i]);
        }
        printf("\n");
    }
}

AC代码

void Print_Factorial(const int N)
{
    if (N < 0)
    {
        printf("Invalid input\n");
    }
    else if (N < 2)             // 0和1的阶层为1
    {
        printf("1\n");
    }
    else if (N > 1 && N < 13)   // 12及之前都可以用long int型表达
    {
        int i = 2;
        long int sum = 1;
        for (i; i <= N; i++)
        {
            sum *= i;
        }
        printf("%ld\n", sum);
    }
    else
    {
        int Num[3000] = { 0 };  // 确保保存最终运算结果的数组足够大:1-9相乘最多有9位,10-99相乘最多有2*90=180位,100-999相乘最多有3*900=2700位,1000是4*1=4位,总计2893,最好数组取大一下
        int i, j, k, n;
        k = 1;                  // 位数
        n = 0;                  // 进位
        Num[0] = 1;             // 将结果先初始化为1
        int temp;               // 阶乘的任一元素与临时结果的某位的乘积结果
        for (i = 2; i <= N; i++)
        {
            for (j = 0; j < k; j++)
            {
                temp = Num[j] * i + n;      // 相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
                Num[j] = temp % 10;         // 更新临时结果的位上信息
                n = temp / 10;              // 看是否有进位
            }
            while (n)                       // 如果有进位
            {
                Num[k] = n % 10;            // 新加一位,添加信息。位数增1
                k++;
                n = n / 10;                 // 看还能不能进位
            }
        }
        for (i = k - 1; i >= 0; i--)
        {
            printf("%d", Num[i]);
        }
        printf("\n");
    }
}

http://www.kler.cn/news/310116.html

相关文章:

  • IOS 25 实现歌单详情(UITableView)列表 ②
  • 即插即用 | YOLOv8热力图可视化方法详解
  • MySQL的(DDL、DCL、DQL、DML)语言学习
  • 7.7opencv中(基于C++) 翻转图像
  • 完全解决git clone超时和git子模块无法下载问题
  • CSS学习路线
  • 11 vue3之插槽全家桶
  • 【JavaEE】多线程编程引入——认识Thread类
  • mysql怎样优化count(*) from 表名 where …… or ……这种慢sql
  • c++基础入门三
  • Java Web开发中处理Response返回值的技巧与实践
  • 1×1卷积核【super star 卷积核】
  • 【数据结构-线段树】【差分】力扣732. 我的日程安排表 III
  • 基于PHP的丽江旅游管理系统
  • VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025
  • STM32快速复习(十二)FLASH闪存的读写
  • [Meachines] [Medium] Bart Server Monitor+Internal Chat+UA投毒+Winlogon用户密码泄露权限提升
  • MySQL高阶1777-每家商店的产品价格
  • 文心智能体 恐怖类游戏
  • 一.Oracle每日运维操作
  • bug | pycharm社区版无sciview解决办法
  • JVM 调优篇7 调优案例1-堆空间的优化解决
  • Holynix: v1
  • 基于SSM的在线家用电器销售系统
  • 【ARM】Trustzone和安全架构
  • [SDX35+WCN6856]SDX35 + WCN6856 WiFi导致系统crash问题分析及解决方案
  • (娱乐)魔改浏览器-任务栏图标右上角加提示徽章
  • 线性链条件随机场(Linear Chain Conditional Random Field)-有监督学习方法、概率模型、生成模型、对数线性模型、参数化模型
  • 力扣(LeetCode)每日一题 1184. 公交站间的距离
  • 前后端分离Vue美容店会员信息管理系统o7grs