因子分解
内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定一个正整数 nn,请将它分解为素数的乘积。
例如 60=2×2×3×5
输入格式
单个整数表示 n
输出格式
若干整数表示 n 的素因子,按照从小到大的顺序输出。
数据范围
2≤ n≤ 1,000,000,0002≤n≤1,000,000,000
样例数据
输入:
60
输出:
2 2 3 5
输入:
3
输出:
3
初学者往往会想到循环求解,但循环求解坑的确很多,只不过这一次初测测试数据比较水,没有测出而已。
个人思路如下:
从1枚举至,找到一个输一个(也可以存在数组里),最后再把那一个大于的因子(也有可能没有,所以要先判断一下,再考虑是不是要)输出。
方法1(数组存入(这里也不是简单存,否则难以估计数组所需空间,所以采用了标记的方法,而不超过sqrt(n)的最大数为三万多一些(超过sqrt(n)的数至多有一个,所以很好解决(上文说到过),留到最后输出即可),所以开了40000),统一输出)(预计得分:100分)(实测100分):
#include <bits/stdc++.h>
using namespace std;
int a[40000],n;
int main(){
cin>>n;
int m=n;//避免改变n,从而影响到循环
for(int i=2;i*i<=n;++i){
while(m%i==0){//找到
a[i]++;//存入
m/=i;
}
}
for(int i=1;i<=35000;++i)for(int j=1;j<=a[i];++j)cout<<i<<" ";
if(m!=1)cout<<m<<endl;//判断是否有上文提到的数
else cout<<endl;
return 0;
}
(数组存,比较费事,浪费空间)
(应我狂热粉丝的要求,将vector做法写一下,咳咳:
#include <bits/stdc++.h>
using namespace std;
vector<int>a;
int n,b;
int main(){
cin>>n;
int m=n;
for(int i=2;i*i<=n;++i){
while(m%i==0){
m/=i;
a.push_back(i);
++b;
}
}
for(int i=0;i<b;++i)cout<<a[i]<<endl;
if(m!=1)cout<<m<<endl;
return 0;
}
)
方法2(优化方法1,找到一个输一个,从而优化时间复杂度和空间复杂度)(预计得分:100分)(实测100分):
#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
int m=n;//避免改变n,从而影响到循环
for(int i=2;i*i<=n;++i){
while(m%i==0){//找到
cout<<i<<" ";//输出
m/=i;
}
}
if(m!=1)cout<<m<<endl;//判断是否有上文提到的数
else cout<<endl;
return 0;
}
(直接输出,空间复杂度比较小且容易实现)