Как я могу отображать только простые числа в этом коде?

Я пытаюсь получить все простые числа в диапазоне 2 и введенное значение, используя этот код C ++:

#include<iostream>
using namespace std;

int main() {
int num = 0;
int result = 0;

cin >> num;

for (int i = 2; i <= num; i++) {
for (int b = 2; b <= num; b++) {
result = i % b;

if (result == 0) {
result = b;
break;
}
}

cout << result<< endl <<;
}
}

проблема в том, что я думаю, что все ближе к логике, но эти тройки и двойки продолжают появляться между простыми числами. Что я делаю неправильно?

1

Решение

Я исправил ваш код и добавил комментарии, где я внес изменения

Ключевым моментом здесь является понимание того, что вам нужно проверить все числа, меньшие «i», если одно из них делит «i», если это так, пометьте число как не простое и разрывное (разрыв — это только оптимизация)

Тогда печатайте только тех, кто прошел «тест» (изначально вы все напечатали)

#include <iostream>
using namespace std;

#include<iostream>
using namespace std;

int main()
{
int num = 0;
int result = 0;

cin >> num;

for (int i = 2; i <= num; i++) {
bool isPrime = true; // Assume the number is prime

for (int b = 2; b < i; b++) { // Run only till "i-1" not "num"result = i % b;

if (result == 0) {
isPrime = false; // if found some dividor, number nut prime
break;
}

}

if (isPrime) // print only primes
cout << i << endl;
}
}
1

Другие решения

Было дано много ответов, объясняющих, как это сделать. Никто не ответил на вопрос:

Что я делаю неправильно?

Так что я попробую.

#include<iostream>
using namespace std;

int main() {
int num = 0;
int result = 0;

cin >> num;

for (int i = 2; i <= num; i++) {
for (int b = 2; b <= num; b++) {  // wrong: use b < i instead of b <= num
result = i % b;

if (result == 0) {
result = b;  // wrong: why assign result the value of b?
// just remove this line
break;
}
}

cout << result<< endl <<; // wrong: you need a if-condtion before you print
// if (result != 0) cout << i << endl;
}
}
1

У вас есть несколько ошибок в вашем коде.

Простейший алгоритм (хотя и не самый оптимальный) для проверки того, является ли N первичным, просто проверяет, не имеет ли он делителей в диапазоне [2; N-1].

Вот рабочая версия:

int main() {
int num = 0;

cin >> num;

for (int i = 2; i <= num; i++) {
bool bIsPrime = true;
for (int b = 2; bIsPrime && b < i; b++) {
if (i % b == 0) {
bIsPrime = false;
}
}

if (bIsPrime) {
cout << i << endl;
}
}
}
0

Я бы предложил вытянуть логику определения, является ли число простым числом для отдельной функции, вызвать функцию из main и затем создать вывод соответственно.

// Declare the function
bool is_prime(int num);

Затем упростим for цикл до:

for (int i = 2; i <= num; i++) {
if ( is_prime(i) )
{
cout << i << " is a prime.\n";
}
}

А затем реализовать is_prime:

bool is_prime(int num)
{
// If the number is even, return true if the number is 2 else false.
if ( num % 2 == 0 )
{
return (num == 2);
}

int stopAt = (int)sqrt(num);

// Start the number to divide by with 3 and increment it by 2.
for (int b = 3; b <= stopAt; b += 2)
{
// If the given number is divisible by b, it is not a prime
if ( num % b == 0 )
{
return false;
}
}

// The given number is not divisible by any of the numbers up to
// sqrt(num). It is a prime
return true;
}
0

Я могу в значительной степени угадать его академическую задачу 🙂

Таким образом, здесь для простых чисел существует множество способов «получить простые числа», некоторые лучше, а некоторые хуже.

Сито эстрогенов — является одним из них, его довольно простая концепция, но немного более эффективная в случае больших чисел (например, нескольких миллионов), поскольку версия OopsUser верна, вы можете попробовать и сами убедиться, какая версия лучше

void main() {
int upperBound;
cin >> upperBound;

int upperBoundSquareRoot = (int)sqrt((double)upperBound);
bool *isComposite = new bool[upperBound + 1]; // create table
memset(isComposite, 0, sizeof(bool) * (upperBound + 1)); // set all to 0

for (int m = 2; m <= upperBoundSquareRoot; m++) {
if (!isComposite[m]) { // if not prime
cout << m << " ";
for (int k = m * m; k <= upperBound; k += m) // set all multiplies
isComposite[k] = true;
}
}

for (int m = upperBoundSquareRoot; m <= upperBound; m++) // print results
if (!isComposite[m])
cout << m << " ";

delete [] isComposite; // clean table
}

Небольшое примечание, хотя я взял простой код реализации для Sive из Вот (написание этой заметки, чтобы она не была незаконной, по правде говоря, хотел показать, что ее легко найти)

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector