Algorithm --> 阶乘和因子

阶乘和因子

要求:输入正整数n(1<n <101), 把阶乘n!=1x2x3x...xn分解成素因子相乘的形式,从小到大输出各个素数(2,3,5,...)的指数。

例如825=3x52x11应表示成(0,1,2,0,1),表示分别有0,1,2,0,1个2,3,5,7,11。程序应忽略比最大素因子更大的素数(否则末尾会有无穷多个0)。

样例输入:
5
53
样例输出:
5!=3 1 1
53!=49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1

算法代码:

#include <iostream>
#include <cstring>
using namespace std;

int prime[100], cnt;

bool isPrime(int n) //判断素数,n不能太大
{
    if(n < 2) return 0;
    for(int i = 2; i * i <= n; i++)
        if(n % i == 0) return 0;
    return 1;
}

int main()
{
    for(int i = 2; i <= 100; i++)    
        if(isPrime(i)) prime[cnt++] = i;   //构造素数表
        
    int N, p[100];
    while(cin >> N)
    {
        if(N < 2 || N > 100) break;
        memset(p, 0, sizeof(p));
        int max = 0;
        for(int i = 1; i <= N; i++)
        {
            int m = i;         //需要把i复制到m中,而不要在做除法时直接修改它
            for(int j = 0; j < cnt; j++)
            {
                while(m % prime[j] == 0)  //反复除以prime[j],并累加p[j]
                {
                    m /= prime[j];
                    p[j]++;
                    if(j > max) max = j;  //更新最大素因子下标
                }
            }
        }
        for(int i = 0; i <= max; i++)  //只循环到最大下标
        {
            cout << p[i] << " ";
        }
        cout << endl;
    }
}
原文地址:https://www.cnblogs.com/jeakeven/p/4642657.html