Prime Number Definition
An integer greater than one is called a prime number if its only positive divisors (factors) are one and itself. For instance, 2, 11, 67, 89 are prime numbers but 8, 20, 27 are not.
Semi-Prime Number Definition
An integer greater than one is called a semi-prime number if it can be decompounded to TWO prime numbers. For example, 6 is a semi-prime number but 12 is not.
Your task is just to determinate whether a given number is a semi-prime number.
Input
There are several test cases in the input. Each case contains a single integer N (2 <= N <= 1,000,000)
Output
One line with a single integer for each case. If the number is a semi-prime number, then output "Yes", otherwise "No".
Sample Input
3
4
6
12
Sample Output
NoSource: Zhejiang University Local Contest 2006, Preliminary
题意:若一个数可表示为两个素因子的乘积,则该数就是一个Semi-Prime数。
先打表求出2~1000000内的素数,再从 2~sqrt(n)依次访问,对所有n可以整除的i中,找出是否存在一个i,使得i与n/i都为素数,若存在,则Yes,否则No
#include
#include
#include
#include
using namespace std;
bool p[1000005];
int a[500000],k;
void init(){
int i,j;
k=0;
memset(p,false,sizeof(p));
for( i = 2 ; i <= 1000000 ; ++i ){
if( !p[i] ){
a[k++] = i;
for( j = i+i ; j <= 1000000 ; j+=i )
p[j] = true;
}
}
}
int main(){
int n;
init();
while( ~scanf("%d",&n) ){
int ret = (int)sqrt(n);
bool flag = false;
for( int i = 2 ; i <= ret ; ++i ){
if( n%i == 0 ){
if( !p[i] && !p[n/i] ){
flag = true;
break;
}
}
}
if( flag ) printf("Yes\n");
else printf("No\n");
}
return 0;
}