Intelligent Factorial Factorization LightOJ - 1035

本文介绍了一种求解N!的质因数分解的方法,通过筛选素数并利用唯一分解定理,实现对N!的高效质因数分解。代码使用C++编写,包括素数筛选和质因数计数等功能。

题目:Intelligent Factorial Factorization   LightOJ - 1035 

题意:本题就是给你一个N,让你求出N!是由哪些素数组成的。参考:https://blog.youkuaiyun.com/REfusing/article/details/88814341

思想:先把素数晒出来,然后求出每个素数由多少个。由于本题的数据量比较小还可以直接用唯一分解定理的方法。

参考博客:Light OJ 1035 Intelligent Factorial Factorization

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
int a[maxn], vis[maxn];
int cn = 1;
void Prime()
{
    memset(vis, 0, sizeof(maxn));
    for(int i = 2; i <= maxn; i++)
    {
        if(!vis[i])
        {
            a[cn++] = i;
        }
        for(int j = 1; j < cn && i*a[j] <= maxn; j++)
        {
            vis[i* a[j]] = 1;
            if(i % a[j] == 0)break;
        }
    }
}
int query(int x, int n)
{
    int ans= 0;
    while(n)
    {
        ans += n / x;
        n /= x;
    }
    return ans;
}
int main()
{
    int n;
    Prime();
    int T, ca = 0;
    scanf("%d", &T);
    while(T--)
    {
        cin>>n;
        printf("Case %d: %d =", ++ca, n);
        for(int i = 1; i < cn; i++)
        {
            int t = query(a[i], n);
            if(t == 0)break;
            if(i != 1)printf(" *");
            printf(" %d (%d)", a[i], t);

        }
        printf("\n");

    }
    return 0;
}

 

### 代码含义 `result = factorial(num - 1) * num;` 这行代码位于递归函数中,用于计算一个数的阶乘。`factorial` 是一个递归函数,`num` 是传入该函数的参数,表示要计算阶乘的数。`factorial(num - 1)` 是对函数自身的调用,其作用是计算 `num - 1` 的阶乘。然后将 `factorial(num - 1)` 的结果与 `num` 相乘,把乘积赋值给变量 `result`。以计算 5 的阶乘为例,当 `num` 为 5 时,`factorial(5)` 会调用 `factorial(4)`,`factorial(4)` 又会调用 `factorial(3)`,依此类推,直到 `num` 为 1 时递归终止,开始回溯计算最终结果。 ### 代码用途 该代码的主要用途是通过递归的方式计算一个数的阶乘。阶乘在数学中有广泛应用,例如排列组合问题。在程序设计中,使用递归可以简洁地实现阶乘计算,符合数学上阶乘的定义 `n! = n * (n - 1)!`。 ### 代码优化 递归方法虽然简洁,但存在一些缺点,如可能导致栈溢出,尤其是在计算较大数的阶乘时。可以使用迭代方法进行优化,迭代方法使用循环来计算阶乘,避免了递归带来的栈空间消耗问题。以下是使用 Python 和 C# 实现的迭代方法: #### Python 实现 ```python def factorial(num): result = 1 for i in range(1, num + 1): result *= i return result n = int(input('请输入阶乘数:')) print(f'{n} !值为 {factorial(n)}') ``` #### C# 实现 ```csharp using System; namespace CalculatorApplication { class NumberManipulator { public int factorial(int num) { int result = 1; for (int i = 1; i <= num; i++) { result *= i; } return result; } static void Main(string[] args) { NumberManipulator n = new NumberManipulator(); Console.WriteLine("6 的阶乘是: {0}", n.factorial(6)); Console.WriteLine("7 的阶乘是: {0}", n.factorial(7)); Console.WriteLine("8 的阶乘是: {0}", n.factorial(8)); Console.ReadLine(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值