題目描述
功能:輸入一個正整數,按照從小到大的順序輸出它的所有質數的因子(如180的質數因子為2 2 3 3 5 )最后一個數后面也要有空格。
來源
分析
1.要求的是某個整數的質數因子,也就是整數的因式分解(所有的因子都要分解成質數)如180 = 2*2*3*3*5。
2.需要知道的是:質數為乘法的最小單元,所有整數都可以表示成 質數的乘積 的形式 具體不做過多介紹。
3.因此,這個就是要求某個整數的因子(所有因子均為質數),然后順序輸出即可。
代碼
#include <iostream>
using namespace std;
int main()
{
long n;
while(cin>>n)
{ //n不為1,繼續分解
while(n != 1)
{ //每次均從2開始
for(int i = 2; i<= n;i++)
{ //每次獲取的i必然為質數
if(n%i == 0)
{
n /= i;
cout<<i<<" ";
break;
}
}
}
}
return 0;
}
改進
上面的算法在n是合數時,並沒有多大的問題,但是如果n是質數且比較大,循環次數將會比較多。因此,可以添加判斷質數的環節,進行一定程度優化。
#include <iostream>
#include <cmath>
using namespace std;
//判斷是否是質數
bool zhishu(long n)
{
bool flag = true;
for(int i = 2; i <= sqrt(n); i++)
{
if(n%i == 0)
{
flag = false;
break;
}
}
return flag;
}
int main()
{
long n;
while(cin>>n)
{
//n不為1,繼續分解
while(n != 1)
{
if(zhishu(n))
{
cout<<n<<" ";
break;
}
else
{
//每次均從2開始
for(int i = 2; i <= n; i++)
{ //每次獲取的i必然為質數
if(n%i == 0)
{
n /= i;
cout<<i<<" ";
break;
}
}
}
}
}
return 0;
}
