题目描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如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;
}