您的位置:首页 > 其它

蓝桥杯 算法提高 质因数2

2018-01-04 12:04 267 查看
因为质数范围写小了一直没有检查出来错误,很难受

ac代码如下

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
vector<int> prime(32768,1); //素数数组的范围需要是题目中给的最大范围因为可能N就是素数
vector<int> ans;
void initprime(){
for(int i=0;i<prime.size();i++){
for(int j=2;j<=sqrt(i);j++){
if(i%j==0){
prime[i]=0;
break;
}
}
}
}

void solve(int n){
while(n){
for(int i=2;i<=n;i++){//不知道为什么这里只能写i<=n,写i<=n/2之类的都会错,不过不改不影响ac
if(n%i==0){
if(prime[i]){
ans.push_back(i);
n/=i;
if(n==1)n=0;
}
}
}
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<" ";
cout<<endl;
cout<<ans.size();
}

int main()
{
int n;
cin>>n;
initprime();
solve(n);
return 0;
}


在阅览各个博主的题解时发现一个很棒的题解
转自http://blog.csdn.net/liuchuo/article/details/60867226

思路是就直接除,因为除过了前面的几个素数就不会被合数除,所以就不用筛选素数了,数学很强

#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int cnt = 0;
while(n != 1) {
for(int i = 2; i <= n; i++) {
if(n % i == 0) {
cout << i << " ";
cnt++;
n = n / i;
break;
}
}
}
cout << endl << cnt;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: