求阶乘问题

本文提供了一个C语言程序,通过递归函数`longFact`计算输入正整数n的阶乘,展示了如何在16KB代码长度内实现n!的输出,适用于编程竞赛或基础教学

输入一个正整数n,输出n!。

输入格式:

输入在一行中给出1个正整数n。

输出格式:

在一行中输出n!的值。

输入样例:

4

输出样例:

24

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

代码如下:

#include<stdio.h>
#include<stdlib.h>
long Fact(long n)
{
        if(n==0)
                return 1;
        else return n*Fact(n-1);}
int main()
{
        long n,a;
        scanf("%ld",&n);
        a=Fact(n);
        printf("%ld",a);
        return 0;
}

在PTA平台上,对于简单阶乘问题有多种解决方法,常见的有循环和递归两种方式。 ### 循环方式 通过循环累乘来计算阶乘如在“PTA 使用函数1到10的阶乘和”中,定义的`fact`函数使用循环解决阶乘问题: ```c double fact(int n) { int i, a = 1; for (i = 1; i <= n; i++) a *= i; return a; } ``` 在“PTA - C语言 - 从1到n之间所有数的阶乘”中,`Fact`函数同使用循环计算阶乘: ```c unsigned long Fact(unsigned int n) { unsigned int i; unsigned long result = 1; for (i = 2; i <= n; i++) result *= i; return result; } ``` ### 递归方式 利用函数自身调用的特性来计算阶乘。如在“7 - 1 简单阶乘问题 (10 分)”中,`f`函数使用递归计算阶乘: ```c++ #include <iostream> using namespace std; int f(int x) { int y; if (x > 1) { y = f(x - 1) * x; } else { return 1; } return y; } int main() { int n; cin >> n; cout << f(n); return 0; } ``` ### 大整数阶乘 当需要计算较大数的阶乘时,普通的数据类型可能无法存储结果,此时可以使用数组来模拟大整数乘法。在“PTA 6 - 10 阶乘计算升级版(最简单的解法适合初学者)”中,`Print_Factorial`函数使用数组解决大整数阶乘问题: ```c void Print_Factorial ( const int N ){ if(N < 0){ printf("Invalid input"); return; } else if(N == 0){ printf("1"); return; // 0的阶乘直接输出1 } int a[3000] = {0}; // 先初始化全部元素为0 a[0] = 1; // 第一位先为1 int wei = 1, temp = 0; // 当前数组的位数 和 需要进位的数 for(int i = 2; i <= N; i++){ // 从2开始 循环到N结束 for(int k = 0; k < wei; k++){ // 把数组的每个位数都乘以阶乘数 a[k] = a[k] * i; } for(int k = 0; k < wei; k++){ // 进位操作 if(a[k] >= 10){ temp = temp + a[k] / 10; a[k] = a[k] % 10; } if(temp > 0){ a[k + 1] += temp; if(k + 1 >= wei){ wei = k + 1 + 1; } } temp = 0; } } for(int i = wei - 1; i >= 0; i--) // 最后倒序输出这个数组 printf("%d", a[i]); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值