C/C++

Написать кусочек С++Выведите в порядке возрастания все простые числа на отрезке [l;r]. Оформите решение в виде функции

Выведите в порядке возрастания все простые числа на отрезке [l;r]. Оформите решение в виде функции bool isPrime(int n), проверяющей число на простоту, и функции vector<int> primes(int l, int r), возвращающей список простых чисел на отрезке [l;r].

Входные данные

Дано два натуральных числа l и r (l≤r≤1000).

Выходные данные

Выведите ответ на задачу.

Примеры
Ввод
Просто написать сегмент кода, который должен быть в рамке с красной каёмкой между bool isPrime(int n) и int main() ? Тут есть разные варианты и в первых двух ответах все функции работают правильно и не только до r=1000, но и когда r>1000. Ограничения не имеют принципиального характера и введены исключительно для удобства тестирования программы и для того, чтобы у кого-то не возникало желания чего-то тут особо оптимизировать. В оптимизации генератора простых чисел можно увязнуть и весьма надолго, а для чисел до 1000 включительно не нужно никакой оптимизации! И вот этот сегмент кода, который я особо и не изобретала, точно подойдёт:
{
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i * i <= n; i += 2)
if (n % i == 0) return false;
return true;
}
vector <int> primes(int l, int r)
{
vector <int> a;
for (int i = l; i <= r; i++)
if (isPrime(i)) a.push_back(i);
return a;
}
Чего тут, собственно, изобретать, когда в первых двух ответах обе функции почти один в один, особенно primes, a isPrime начинает цикл с тройки и идёт по нечётным числам до √n, что вполне грамотно? Но ещё тут, по-моему, сам исходный код требует срочного исправления. Почему пробельный символ в нём выводится как строка, а не как символ, и зачем вообще числа через пробел выводить? Чтобы получить такой вот ратотуй?
Нуржан Бахчанов
Нуржан Бахчанов
29 440
Лучший ответ
Бакытжан Шапыков спасибо огромное ?
все остальные варианты не подходили)
#include <iostream>
#include <vector>
using namespace std;
bool is_prime(int x) {
bool p;
if (x == 1) p = false;
else if (x == 2) p = true;
else if (~x & 1) p = false;
else if (x < 6) p = true;
else if (0 == x % 3 || 0 == x % 5) p = false;
else {
int n;
for (n = 3; n * n <= x && x % n; n += 2) { ; }
p = n * n > x;
}
return p;
}
vector<int> primes(int l, int r) {
vector<int> res;
for (auto n = l; n <= r; ++n) if (is_prime(n)) res.push_back(n);
return res;
}
int main() {
cout << "l r: ";
int l, r;
cin >> l >> r;
auto res = primes(l, r);
for (auto x : res) cout << x << ' ';
puts("");
}
ZA
Zamir Abdullayev
72 518
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
bool isPrime(int n)
{
if (n < 2) return false;
if (n == 2 || n == 3 || n == 5 || n == 7 ||
n == 11 || n == 13 || n == 17 || n == 19 ||
n == 23 || n == 29) return true;
if (n % 2 == 0 || n % 3 == 0 || n %5 == 0 ||
n % 7 == 0 || n % 11 == 0 || n % 13 == 0 ||
n % 17 == 0 || n % 19 == 0 || n % 23 == 0 ||
n % 29 == 0) return false;
int i, m = ceil(sqrt(n));
for (i = 31; i <= m; i += 2)
if (n % i == 0) return false;
return true;
}
vector <int> primes(int l, int r)
{
vector <int> a;
for (int i = l; i <= r; i ++)
if (isPrime(i)) a.push_back(i);
return a;
}
int main()
{
int i, l, r;
vector <int> res;
cout << "l r: ";
cin >> l >> r;
res = primes(l, r);
for (i = 0; i < res.size(); i++)
cout << res[i] << ' ';
}
Чтобы числа печатались в виде красивой таблицы, надо делать подгонку под экран, а я не знаю, в какой системе Вы работаете. В функции isPrime куча простых чисел дана для ускорения поиска, но не думаю, что поиск от этого намного ускоряется, поэтому её можно и несколько подсократить. В функции primes можно делать цикл только по нечётным i от l до r, но я не стала так делать для того, чтобы двойка в итоговый вектор попадала. А вообще тут можно провести очень серьёзную и глубокую оптимизации -в этом нет сомнения, хотя и так всё быстро работает.
Андрей Варчук for (i = 31; i <= m; i += 2)
if (n % i == 0) return false;
return true;
- в чем смысл этих строк? Вы проверили неделимость на простые до 29, надо ещё 31 добавить - и все! Это уже будет достаточным условием простоты для числа, не превышающего 1000.
Игорь Григорьев Тогда лучше так:
#include &lt;cmath>
#include &lt;vector>
#include &lt;iomanip>
#include &lt;iostream>
using namespace std;
bool isPrime(int n)
{
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
int i, m = ceil(sqrt(n));
for (i = 3; i <= m; i += 2)
if (n % i == 0) return false;
return true;
}
vector &lt;int> primes(int l, int r)
{
vector &lt;int> a;
for (int i = l; i <= r; i++)
if (isPrime(i)) a.push_back(i);
return a;
}
int main()
{
int i, j = 0, l, r;
vector &lt;int> res;
cout << "l r: ";
cin >> l >> r;
res = primes(l, r);
for (i = 0; i < res.size(); i++)
{
cout << setw(5) << res[i];
j++;
if (j == 10)
{
j = 0;
cout << endl;
}
}
if (j) cout << endl;
system("pause > nul");
return 0;
}
Игорь Григорьев &lt; -это знак <
Так намного симпатичнее:
#include <iostream>
#include <vector>
using namespace std;
bool isPrime(int n)
{
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i * i <= n; i += 2)
if (n % i == 0) return false;
return true;
}
vector <int> primes(int l, int r)
{
vector <int> a;
for (int i = l; i <= r; i++)
if (isPrime(i)) a.push_back(i);
return a;
}
{
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i * i <= n; i += 2)
if (n % i == 0) return false;
return true;
}
vector <int> primes(int l, int r)
{
vector <int> a;
for (int i = l; i <= r; i++)
if (isPrime(i)) a.push_back(i);
return a;
}
int main()
{
int l, r;
cin >> l >> r;
vector<int> res = primes(l, r);
for (int i = 0; i < res.size(); ++i){
cout << res[i] << " ";
}
return 0;
}

Похожие вопросы