有這麼一道題:功能:輸入一個正整數,按照從小到大的順序輸出它的所有質數的因子(如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;
}