哎,个人觉得看别人代码总是好的(我也是看书的),人外有人,天外有天嘛!
# include <iostream>
using namespace std;
int n, w, ans[1000010], tot, s; // 1…n 的数中 tot 个素数从小到大放在 ans 数组里(多清楚-_-||)
bool vis[100000010];
int main() {
cin >> n >> w;
for(int i = 2; i <= n; i++) { // 线性筛选素数开始,一共七行,效率高,原理下面解释!
if(vis[i] == false) ans[++tot] = i;
for(int j = 1; (j <= tot) && (i*ans[j] <= n); j++) {
vis[i * ans[j]] = true;
if(i % ans[j] == 0) break;
}
}
while(w--) {
cin >> s;
int i = 1, j = tot, mid;
while(i <= j) { // 别问我这是什么(二分查找喽)
mid = (i + j) / 2;
if(s == ans[mid]) { cout << "Yes" << endl; break; }
else if(s < ans[mid]) j = mid - 1;
else i = mid + 1;
}
if(s != ans[mid]) cout << "No" << endl;
}
return 0;
}
上面代码中,线性筛选素数的时间复杂度为 O(n), 你没看错。
筛选素数原理:合数可以由一个质数数与另一个数相乘得到 (高级一点的解释我就不会了)