质因数分解,简单易懂!

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
struct Factor{
    
    
    int x,cnt;
};
Factor factor;
Factor fac[10];//存储分解的质因数
int prime[maxn],p_num=0;//存储质数
int num;//准备分解的数
int number = 0;//不同质因数的个数

bool is_prime(int n)
{
    
    
    if(n==1) return false;
    int sqr = (int)sqrt(n*1.0);
    for(int i=2;i<=sqr;i++)
        if(n%i==0) return false;
    return true;
}
void get_prime()
{
    
    
    for(int i=2;i<maxn;i++)
        if(is_prime(i))
            prime[p_num++]=i;
}
void get_num()
{
    
    
    cin>>num;
}
void disassemble(int n)
{
    
    
    int sqr = (int)sqrt(n*1.0);
    for(int i=0;i<p_num&&prime[i]<=sqr;i++)
    {
    
    
        if(n%prime[i]==0)
        {
    
    
            fac[number].x = prime[i];
            fac[number].cnt = 0;
            while(n%prime[i]==0)
            {
    
    
                fac[number].cnt++;
                n/=prime[i];
            }
            number++;
        }
        if(n==1) break;
    }
    if(n!=1)
        fac[number].x = n,fac[number].cnt = 1;
}
void print()
{
    
    
    cout<<num<<"="<<fac[0].x;
    for(int j=2;j<=fac[0].cnt;j++)
        cout<<"x"<<fac[0].x;
    for(int i=1;i<number;i++)
        for(int j=1;j<=fac[i].cnt;j++)
            cout<<"x"<<fac[i].x;
}
int main()
{
    
    
    get_prime();
    get_num();
    disassemble(num);
    print();
    return 0;
}


注意:
分解根据的原理是:
对于一个正整数n来说,如果存在[2,n]范围内的质因子,那么这些质因子全部小于sqrt(n),或者最多只存在一个大于sqrt(n)的质因数。显然不可能会有两个这样的数否则想乘会大于n。

猜你喜欢

转载自blog.csdn.net/weixin_44142774/article/details/114707430