质因子分解——Prime Factors

先上原理

对于一个非素数来说有两种情况

1,所有质因子小于等于sqrt(n)

2,只存在一个大于sqrt(n)的质因子,其他质因子都小于sqrt(n)

至于证明,可以用反证法。

若是有多余一个大于sqrt(n)的质因子,这些因子的乘积.....

下面上代码

这里借助一个结构体,当然你也可以用数组

struct factor {
    int x;//记录素因子
    int cnt;//素因子的个数
}fac[10];

2  3  5  7  11  13  17  19  23  29

以上10个素数的乘积已经超过了int的表示范围

故而结构体数组只开了10个

int prime_num;//质因子的个数
void prime_fac(int n)
{
    for(int i=0;i<=sqrt(n);i++)
    {
        if(n%prime[i]==0)
        {
            fac[prime_num].x=prime[i];
            while(n%prime[i]==0)
            {
                fac[prime_num].cnt++;
                n=n/prime[i];
            }
            prime_num++;
        }
    }
    if(n!=1)
    {
        fac[prime_num].x=n;
        fac[prime_num].cnt=1;
        prime_num++;
    }
}

该函数执行结束,fac结构体数组中就是质因子的分解结果

posted @ 2020-03-16 22:33  ecnu_lxz  阅读(418)  评论(0编辑  收藏  举报