2016-12-05 3 views
-3

Это то, что я написал до сих пор, где я ошибся?Пытается создать программу, которая читает массив и печатает простые числа

#include <iostream> 
using namespace std; 

int main() 
{ 
int x[5], count=0; 
for (int i=0;i<5;i++) 
cin>>x[i]; 

for (int i=0;i<5;i++) 
{ 
for (int n=2;n<x[i];n++) 
    { 
    if (x[i]%n==0) 
    count++; 
    }  
if (count==1) 
cout<<x[i]<<" "; 
} 
} 

Edit: Большое спасибо всем, кто пытался помочь. Проблема заключалась в том, что мне приходилось подсчитывать в цикле, чтобы он начинался с 0 каждый раз. Вот мой новый рабочий код:

#include <iostream> 
using namespace std; 

int main() 
{ 
int x[5]; 
for (int i=0;i<5;i++) 
cin>>x[i]; 

for (int i=0;i<5;i++) 
{ int count=0; 
    for (int n=2;n<=x[i];n++) 
    { 
    if (x[i]%n==0) 
    count++; 
    }  
if (count==1) 
cout<<x[i]; 
} 
} 
+6

В чем проблема, которую вы заметили? – George

+1

Крошечная программа, подобная этой, действительно отличная возможность познакомиться с отладчиком. Вы можете выполнить код за строкой и проверить значения переменных, чтобы узнать, где программа ведет себя отличную от вашего ожидания. –

+1

Подсказка: выделите часть, которая на самом деле выполняет основной тест: постройте 'bool isPrime (unsigned n)' и оттуда. Есть более эффективные способы сделать это, но это поможет вам начать. – Bathsheba

ответ

0
#include <iostream> 
using namespace std; 

int main() 
{ 
int x[5], count=0; 
for (int i=0;i<5;i++) 
cin>>x[i]; 

for (int i=0;i<5;i++) 
{ 
    bool check = true; 
    for (int n=2;n<x[i];n++) 
    { 
     if (x[i]%n==0) 
     { 
      check = false; 
      break; 
     } 
    }  
    if (check) 
    cout<<x[i]<<" "; 
} 
} 

Для лучшей сложности, изменить ваш вложенный цикл для:

for (int n=2;n<=sqrt(x[i]);n++) 

Другой способ:

int main() 
{ 
    for (int i=2; i<100; i++) 
    { 
     bool check=true; 
     for (int n=2; n*n<=x[i]; n++) 
     { 
      if (x[i] % n == 0) 
      { 
       check=false; 
       break;  
      } 
     } 
     if(check) cout << x[i] << " "; 
    } 
    return 0; 
} 
+0

Но зачем вообще вычислять 'sqrt'? Не говоря уже несколько раз (при отсутствии оптимизаций компилятора). Что случилось с 'n * n <= x [i]'? – Bathsheba

+0

@ Батшеба, ты прав, я добавлю это. – instance

+0

Если вы отделили тест primality от итерации по массиву и вообще отбросили 'n Bathsheba

0

Вот мое решение. Я в основном предполагаю, что все числа являются первичными, но если я нахожу их не главными, я их не распечатываю.

int main() { 
    bool primeNumber; 
    int length = 0; 
    int x[5], count=0; 

    for (int i=0;i<5;i++){ 
     length++; 
     cin>>x[i]; 
    } 
    for (int i = 0; i < length; i++) 
    { 
     primeNumber = true; 
     for (int j = 3; j <= x[i]/2; j += 2)//Not necessary to check agains numbers higher than half the number you want to check 
     { 

     if (x[i] % j == 0) 
     { 
      primeNumber = false; 
     } 
    } 
    if(primeNumber){cout << "Primenumber: " << x[i] << endl;} 
    } 
} 

EDIT: Вот комментарий на код Допустим, ваш массив выглядит следующим образом

{5,9,13,15, 17} 



int main() 
{ 
    int x[5], count=0; 
    for (int i=0;i<5;i++) 
    cin>>x[i]; 

    for (int i=0;i<5;i++) 
    { 
     for (int n=2;n<x[i];n++) 
     { 

Здесь вам цикл из 2-4 (2,3,4). Нужно только набрать половину номера, который вы хотите проверить. например (x [i]/2), но вы можете сделать это, как вы это сделали.

  if (x[i]%n==0){  
      count++;} 

Когда число равно 5, и вы проверить Agains п чисел Это даст 5% 2 = 1,5% 3 = 2,5% 4 = 1. Но 5 - простое число, и ваш код не смог его обнаружить.

 }  
    if (count==1)  

Допустим, вы нашли, что 5 является простым выше, и вам удалось увеличиваем счетчик на 1. Что происходит, когда вы найдете еще простое число в массиве, например, 7. Это сделает счет равным 2. Но вы проверяете только 1, так что ваше следующее простое число не печатается, потому что счет будет равен 1 после первого простого числа, а не остального.

cout<<x[i]<<" "; 
    } 

}

Надеюсь, вы поняли мое объяснение. Это всегда помогает перевести ваш код вручную или режим отладки и подумать, что код будет делать с разными номерами.

+0

Благодарю всех вас за ваши ответы. Может ли кто-нибудь объяснить мне, почему мой исходный код не правильно определяет простые числа? В вложенном цикле я начал с 2 до числа n, и счет увеличивался на единицу каждый раз, когда остаток равен 0. (В принципе, простые числа будут делятся только сами по себе), а затем cout x [i] внутри основной цикл. Где именно я ошибался в этом? –

+0

Я обновил свой ответ с объяснением. – Starlord

+0

Я, наконец, узнал, что было не так после прочтения вашего комментария. Я добавил int count в основном цикле, а не в начале, таким образом, каждый раз, когда счет начинается с 0. Я очень благодарен за вашу помощь, я провел несколько дней, пытаясь заставить его работать и не имея понятия. –

0

Все числа делятся сами по себе. Это сделает все числа первыми, если вы попытаетесь разделить числа с собой

Смежные вопросы