經典算法 | 求整數的全部質數因子分析與解答

有這麼一道題:功能:輸入一個正整數,按照從小到大的順序輸出它的所有質數的因子(如180的質數因子爲2 2 3 3 5 )

最後一個數後面也要有空格

 

這一道題目讓你找給定整數N的全部的質數因子。

一般的人可能會考慮每一次遍歷一遍2到N的全部的整數,找到一個質數因子a,然後N/=a,直到N等於1,但是這種方法其實就是暴力搜索,時間效率並不好

其實有一種更好的方法,就是設定i=2,i一直遞增,當N%i==0的時候,N/=i,否則i++,直到i>N,這樣找到的所有N%i==0的i就是N的所有的質數因子

但是這樣爲何可行呢,

我們假設從2開始,找到的第一個N%i==0的i爲a1,首先a1一定是質數,因爲假如a1是合數的話在2和a1之間一定存在其他N可以整除的質數,但是i是從2開始找到的第一個可以整除的數,因此i只能是質數,也就是說i是N最小的質因子

我們進行N/=i,直到(N/=i)!=0,這裏得到的每一個i都是N的質因子,假如這個時候N還有其他質因子存在,那麼N>i,否則N<i算法結束

這個時候從2到a1的所有的質因子都分解完畢

然後從a1繼續往後找,找到第二個N可以整除的數a2,a2不可能是合數,因爲假如a2是和數的話,2到a1,或者是a1到a2之間一定存在沒有分解的質數,而這是不可能的,所以a2一定是質數,且是N第二大的質因子,進行N/=a2,直到(N/=a2)!=0

繼續以上操作,當找到最後一個質因子的時候,N==i,這個時候(N/=i)=1<i,算法結束,至此,N的所有質因子都找到了

代碼:

#include <iostream>
using namespace std;
int main()
{
    long num;
    cin>>num;
     
    for(int i=2;i<=num;)
    {
        if(num%i==0)
        {
            cout<<i<<" ";
            num/=i;
        }
        else i++;
    }
    return 0;
}

發佈了234 篇原創文章 · 獲贊 19 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章