问题:判断一个数是否是两个质数的乘积。
Problem: Nearly prime number is an integer positive number for which it is possible to find such primes P1 and P2 that given number is equal to P1*P2. There is given a sequence on N integer positive numbers, you are to write a program that prints “Yes” if given number is nearly prime and “No” otherwise.
解法:筛法求质数,再枚举。枚举时要用O(Sqrt(N))的复杂度判断另一个质数。
Solution: Obtain prime numbers by sieving method, then enumerate them. Please note that you need to use the method of complexity of O(Sqrt(N)) to judge the other number whether it is a prime number in case it is very large.
#include <iostream> #include <stdio.h> #include <cmath> #include <cstring> #include <math.h> using namespace std; int n,m,pnum,p[100100]; bool f[1000100]; bool isprime(int x) { if (x<2) return 0; for (int i=2;i*i<=x;i++) if (x%i==0) return 0; return 1; } int main() { pnum = 0; memset(f,0,sizeof(f)); f[1] = true; for (int i=2;i<=1000010;i++) if (!f[i]) { pnum++; p[pnum] = i; for (int j=i+i;j<=1000010;j+=i) f[j] = true; } scanf("%d",&n); while (n--) { bool ans = false; scanf("%d",&m); for (int i=1;i<=pnum;i++) { if (p[i]*p[i]>m) break; if ((m%p[i]==0) && isprime(m/p[i])) { ans = true; break; } } if (ans) printf("Yes\n"); else printf("No\n"); } return 0; }
原文:http://blog.csdn.net/lotus_land/article/details/18844237