这个题的题意大概是给出一个一百万以内的数,要求判断这个数是不是半素数(题目给出半素数的定义为可以分解成两个素数乘积的数)
思路:分析题目,欲想得到半素数,先得到素数,然后判断是否构成分解,由于常规算法费时长,选用了较low的筛素数算法(改进版未看懂)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include<iostream>
#include<vector>
using namespace std;
vector<int>prime;
bool a[1000001];
void getzero()
{
for (int i=1;i<=1000000;i++)a[i]=1;
}
int total=0;
void getprime()
{
for (int i=2;i<=1000000;i++)
{
if (a[i])
for (int j=2*i;j<=1000000;j+=i)
a[j]=false;
}
}
void primeget()
{
for (int i=2;i<=1000000;i++)
{
if (a[i])
{
prime.push_back(i);
total++;
}
}
}
int main()
{
int i,j,k,l,m,n,x,y;
getzero();
getprime();
primeget();
while (cin>>n)
{
for (i=0,x=0;prime[i]<=n/2;i++)
{
if (n%prime[i]==0)
{
if (a[n/prime[i]]==1)
{
cout<<"Yes"<<endl;
x=1;
break;
}
}
}
if (x==0)cout<<"No"<<endl;
}
}