范围素数 C++
Range Primes C++
我有一个问题,我有这个作业
给定一个正整数X,我们要找到其中包含X的最短区间[A,B],其中A和B也是质数。
输入
输入的第一行包含一个整数 M (1 <= M <= 100)。接下来是 M 行,每行都有一个数字 X
(1 < X <= 10^5).
输出
M 行包含 A 和 B (1 < A <= B <= 10^6), B-A <= 10^4.
样本输入
2
2
4
示例输出
2 2
3 5
我这样做了,但这并没有解决问题。如何打印 X 数的素数?如果我没有范围。
#include <iostream>
using namespace std;
int main()
{
int n = 0, c = 0, c2 = 0, res = 0, nc = 0;
cout << "Introduce el limite de numeros: ";
cin >> n;
for (c = 1; c <= n; c++) {
for (c2 = 1; c2 <= n; c2++) {
res = c % c2;
if (res == 0) {
nc = nc + 1;
}
}
if (nc == 2) {
cout << " " << c;
}
nc = 0;
}
}
嗯,你可以用公式找出哪些数是质数,然后与你的X数比较,然后加1或取1。
如果您的代码适用于在线裁判(似乎是),那么您应该尝试这样的事情:
#include <bits/stdc++.h>
#define MAX 1000005
#define endl '\n'
using namespace std;
bool prime[MAX];
vector<int> primes;
void build() {
memset(prime, true, sizeof prime);
prime[0] = prime[1] = false;
for (int i = 2; i < MAX; ++i) {
if (!prime[i]) continue;
primes.push_back(i);
for (int j = i + i; j < MAX; j += i) {
prime[j] = false;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
build();
int m;
cin >> m;
while (m--) {
int x;
cin >> x;
auto b = lower_bound(primes.begin(), primes.end(), x);
auto a = b;
if (*a != primes[0])
a--;
cout << *a << " " << *b << endl;
}
return 0;
}
它只是建立一个埃拉托色尼筛法,然后执行二分搜索寻找 >= 给定数字的最低素数,然后查找(如果它不是最小的)它的前身。 x
将包含在该间隔内;当然很容易注意到它是可能的最小间隔。
我有一个问题,我有这个作业
给定一个正整数X,我们要找到其中包含X的最短区间[A,B],其中A和B也是质数。
输入 输入的第一行包含一个整数 M (1 <= M <= 100)。接下来是 M 行,每行都有一个数字 X (1 < X <= 10^5).
输出 M 行包含 A 和 B (1 < A <= B <= 10^6), B-A <= 10^4.
样本输入
2
2
4
示例输出
2 2
3 5
我这样做了,但这并没有解决问题。如何打印 X 数的素数?如果我没有范围。
#include <iostream>
using namespace std;
int main()
{
int n = 0, c = 0, c2 = 0, res = 0, nc = 0;
cout << "Introduce el limite de numeros: ";
cin >> n;
for (c = 1; c <= n; c++) {
for (c2 = 1; c2 <= n; c2++) {
res = c % c2;
if (res == 0) {
nc = nc + 1;
}
}
if (nc == 2) {
cout << " " << c;
}
nc = 0;
}
}
嗯,你可以用公式找出哪些数是质数,然后与你的X数比较,然后加1或取1。
如果您的代码适用于在线裁判(似乎是),那么您应该尝试这样的事情:
#include <bits/stdc++.h>
#define MAX 1000005
#define endl '\n'
using namespace std;
bool prime[MAX];
vector<int> primes;
void build() {
memset(prime, true, sizeof prime);
prime[0] = prime[1] = false;
for (int i = 2; i < MAX; ++i) {
if (!prime[i]) continue;
primes.push_back(i);
for (int j = i + i; j < MAX; j += i) {
prime[j] = false;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
build();
int m;
cin >> m;
while (m--) {
int x;
cin >> x;
auto b = lower_bound(primes.begin(), primes.end(), x);
auto a = b;
if (*a != primes[0])
a--;
cout << *a << " " << *b << endl;
}
return 0;
}
它只是建立一个埃拉托色尼筛法,然后执行二分搜索寻找 >= 给定数字的最低素数,然后查找(如果它不是最小的)它的前身。 x
将包含在该间隔内;当然很容易注意到它是可能的最小间隔。