质数分解


将n分解质因数的高效代码

for(int i=2;i<=sqrt(n);i++)  
{
    if(n%i==0&&(n/=i))  
        {
            cout<< i--; //i可以被整除,i--抵消for中的i++继续除i
        }
}
cout<< n; // n最后也为一个质因数

一般方法:

i从2开始到sqrt(n)的每一个i由n试除,如果能整除就再判断i是不是素数,如果是则i是n的一个质因子,然后n=n/i ,再将i归位回2 再寻找n的质因子

优化:

大致思路不变,进行了一些剪枝,首先还是i从2开始到sqrt(n)的每一个i由n试除 ,如果i能整除n,那么不用判断i,i必为n的质因子,将n=n/i , 因为n可能有多个相同的质因子,为了避免遗漏,只需将i– ,当跳到下一步循环的时候与i++抵消,i的值不变,由于由2~i的每一个数都已经判断过是否能整除n,所以不必要再将i回退到2,只需另i在跳到下步循环的时候值不变即可,最后n也会被约成质数,也是一个质因子,这个优化来自 Here

上面for循环中,求开方每次都有计算可以优化一下:

for(int i=2,sqr=sqrt(n);i<=sqr;i++)  
{
    if(n%i==0&&(n/=i))  
        {
            sqr=sqrt(n);
            cout<< i--;
        }
}
cout<< n;  

再改进,因为质数中除2外都是奇数,所以i可以一次前进两步:

while(n%2==0)
{
    cout<<2;
    n/=2;
}
for(int i=3,sqr=sqrt(n);i<=sqr;i+=2)  
{
    if(n%i==0&&(n/=i))  
        {
            sqr=sqrt(n);
            cout<< i;
            i-=2;
        }
}
cout<< n;  

Haiyang Xu 07 July 2014