2014-11-22 2 views
-5

Могу ли я помочь? Я начинаю, и я не знаю, что не так с моей программой. Он генерирует мне все числа n, а не просто простые числа. Зачем?Почему он не генерирует мне первые n простых чисел?

#include <iostream> 

using namespace std; 

int main() 
{ 
    unsigned int i,n,d; 
    bool prim; 
    cout<<"n="; 
    cin>>n; 
    for(i=2;i<=n;i=i+1) 
    { 
     prim=true; 
     for(d=2;d<=i/2;d=d+1) 
     if(i%d==0) 
     { 
      prim=false; 
      break; 
     } 
     (prim); 
     cout<<i<<","; 
    } 
    return 0; 
} 
+0

Вы можете запрограммировать правильный отступ в пробелах и фигурных скобках. Это всегда поможет вам. –

ответ

0

Вместо (prim); использования if(prim). Остальная часть вашего кода верна.

#include <iostream> 

using namespace std; 

int main() 
{ 
unsigned int i,n,d; 
bool prim; 
cout<<"n="; 
cin>>n; 
for(i=2;i<=n;i=i+1) 
    { 
    prim=true; 
    for(d=2;d<=i/2;d=d+1) 
    if(i%d==0) 
    { 
     prim=false; 
     break; 
    } 
    if(prim) 
     cout<<i<<", "; 
    } 
    return 0; 
} 
0

Неправильное состояние вашего состояния.

(prim);cout<<i<<","; 

должен быть

if(prim) cout<<i<<","; 

Обратите внимание, что ваша логика печатает простые числа < = п, а не первые n простых чисел.

1

Поскольку (prim) не то же самое, как:

if (prim) { 
    cout << i << ","; 
} 

На стороне записки:

  • d=d+1 и i=i+1 может быть просто d++ и i++
  • Вы можете объявлять переменные внутри петли, как : for (int i = 0;
0

if заявление может быть уменьшена немного:

prim && cout<<i<<","; 

Это из-за оценки ярлыка логических выражений. Таким образом, cout будет оцениваться только в том случае, если значение prime истинно. Если оно ложно, cout не будет оцениваться как выражение в любом случае.

Незначительный комментарий: делитель (d) может быть увеличен до пола (sqr (i)), а не до i/2 (более эффективно). Переменная i может быть запущена с 3 и увеличена на 2, так как все четные числа не являются первыми (кроме 2, их можно распечатать без учета ...).

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