素数分解和合数筛选

根据唯一分解定理,任何一个数都可以分解成若干个素数的乘机,代码如下:

//factor[i][0]存放分解的素数
//factor[i][1]存放对应分解的素数出现的次数
//fatCnt存放分解出的素数的个数(相同出现的只算一次)
#include <iostream>
#include <cstring>
 
using namespace std;
 
const int MAXN=100000;///MAXN的大小与题目规模有关
int prime[MAXN+1];
void getPrime()
{
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=MAXN;i++)
    {
        if(!prime[i])
            prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}
long long factor[100][2];
int fatCnt;
int getFactors(long long x)
{
    fatCnt=0;
    long long tmp=x;
    for(int i=1;prime[i]<=tmp/prime[i];i++)
    {
        factor[fatCnt][1]=0;
        if(tmp%prime[i]==0)
        {
            factor[fatCnt][0]=prime[i];
            while(tmp%prime[i]==0)
            {
                factor[fatCnt][1]++;
                tmp/=prime[i];
            }
            fatCnt++;
        }
    }
    if(tmp!=1)
    {
        factor[fatCnt][0]=tmp;
        factor[fatCnt++][1]=1;
    }
    return fatCnt;
}
 
int main()
{
    long long n;
    getPrime();
    cin>>n;
    int num=getFactors(n);
    for(int i=0;i<num;i++)
    {
        cout<<factor[i][0]<<"   "<<factor[i][1]<<endl;
    }
    return 0;
}

ps:代码主要参考kuangbin 

 

点赞