描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
数据范围:
输入描述:
输入一个整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
思路分析1:
一定要认真审题,输出结果是每一个都要有空格,最后一个字符也要有空格
思路分析2:质数的定义是大于1的自然数中,只能被1和它本省整除。这里有个简单思路就是遍历,遍历从2到n,整除可以得到所有因子。但是题目要求的,整除后就是最小质因子。这里要有个理解,如何得到最小质因子,保证不超时。
最小因子的个数从0-sqrt(n),一定在这个范围内。因为num的因数一个大于sqrt(n),另外一定是小于sqrt(n)。
这里还有个条件,要重复输出质数因子:num = num /i 内部循环去掉i,外部循环一直增加;
这种算法比较节约时间,但是180的最后一个质因子5,无法整除sqrt(5),无法进入循环,它本身就是质数,只需要输出最后一个质因子即可。
// 输入一个正整数,按照从小到大的顺序输出它的所有质数因子(重复的也要列举),如180的因子
// 2 2 3 3 5
// 输出描述,按照从小到大排序,输出所有质因子,以空格隔开;
// 质数又叫做素数,大于1的自然数中,只能被1和它自生整除;
// 输出描述:
// 按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
# include <cmath>
# include <iostream>
using namespace std;
int main()
{
long num;
cin>>num;
for( long i = 2; i <= sqrt(num); i++ )
{
while(num % i == 0) //所有的质数前面全部除掉,后续就不会有合因子
{
cout<<i<<" ";
num = num/i;
}
}
// 180最后一个元素就是质因子5,无法整除小于sqrt(5)的i,直接输出
if(num - 1 > 0)
{
cout<<num<<" "<<endl;
}
system("pause");
return 0;
}
参考另外一个博客的文章,牛客网编译运行后超时,n个数多次重复增加:
经典算法 | 求整数的全部质数因子分析与解答_BoomHusky的博客-CSDN博客_质数因子
#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;
}
这里看到牛客网友大佬的C++简洁代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int num = 0;
cin >> num;
//质数因子从2开始,到√num
for(int i = 2; i * i <= num; i++) {
if(num % i == 0) {
cout << i << " ";
num = num / i;
i = 1; //因为循环结束会+1,这里重置i为1,下一循环继续从2开始
}
}
cout << num << " ";
return 0;
}