筛法+两次遍历 113. 亚质数 时限: 0.50 sec 空间: 4096 KB 亚质数可以表示成两个质数的积的正整数。在一个给出的长度为 N 的正整数序列中,你需要用 "Yes" 和 "No" 来判断序列中的每一个数是不是亚质数。 输入 包含 N+1 个正整数。第一个数是 N (1<=N<=10)。后 N 个数表示序列,均不超过 109 。数字被空格格开。 输出 对于序列中的每一个数都输出1行:用 "Yes" 和 "No" 来判断这个数是不是亚质数。 样例输入 1 6 样例输出 Yes #include <iostream> #include <cmath> using namespace std; const int N = 32000 + 1; bool is[N]; int prm[N]; int getprm(int n) { int i, j, k = 0; int s, e = (int)(sqrt(1.0*n) + 1); memset(is, 1, sizeof(is)); prm[k++] = 2; is[0] = is[1] = 0; for(i = 4; i < n; i += 2) is[i] = 0; for(i = 3; i < e; i += 2) { if(is[i]) { prm[k++] = i; for(s = i * 2, j = i * i; j < n; j += s) is[j] = 0; } } for(; i < n; i += 2) if(is[i]) prm[k++] = i; return k; } int main() { int t = getprm(N); int n; cin >> n; while(n--) { int m; cin >> m; int flag = 0; for(int i = 0; i < t; i++) { if(prm[i] >= m) break; if(m % prm[i] == 0) { flag++; m /= prm[i]; break; } } for(int i = 0; i < t; i++) { if(prm[i] >= m) break; if(m % prm[i] == 0) { flag++; m /= prm[i]; break; } } if(flag == 1) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }