【发布时间】:2020-05-27 09:16:02
【问题描述】:
Peter 想为他的密码系统生成一些素数。帮助他!你的任务是生成两个给定数字之间的所有素数!
输入 输入以单行中的测试用例数量 t (t
输出 对于每个测试用例,打印所有质数 p,使得 m
示例 输入:
2
1 10
3 5
输出:
2
3
5
7
3
5
警告:大量输入/输出数据,请注意某些语言(但如果算法设计良好,大多数应该没问题)
我在谷歌上查找了上述问题的优化解决方案,这是代码。
#include <iostream>
#include <cmath>
#include <vector>
#include <set>
using namespace std;
int main() {
vector<int> primes;
primes.push_back(2);
for (int i = 3; i <= 32000; i+=2) {
bool isprime = true;
int cap = sqrt(i) + 1;
vector<int>::iterator p;
for (p = primes.begin(); p != primes.end(); p++) {
if (*p >= cap) break;
if (i % *p == 0) {
isprime = false;
break;
}
}
if (isprime) primes.push_back(i);
}
int T,N,M;
cin >> T;
for (int t = 0; t < T; t++) {
if (t) cout << endl;
cin >> M >> N;
if (M < 2) M = 2;
int cap = sqrt(N) + 1;
set<int> notprime;
notprime.clear();
vector<int>::iterator p;
for (p = primes.begin(); p != primes.end(); p++) {
if (*p >= cap) break;
int start;
if (*p >= M) start = (*p)*2;
else start = M + ((*p - M % *p) % *p); //not able to understand this logic.
for (int j = start; j <= N; j += *p) {
notprime.insert(j);
}
}
for (int i = M; i <= N; i++) {
if (notprime.count(i) == 0) {
cout << i << endl;
}
}
}
return 0;
}
我无法理解上面的代码。请帮助我理解它。我只是不明白这个程序背后的逻辑(我知道 STL,只是想了解逻辑)。
【问题讨论】:
-
将 M 向下舍入到
*p的前一个倍数。