2013-07-20 3 views
0

Эта программа должна отображать простые числа в диапазоне 1-3000, но она отображает только простые числа от 743-3000. Как заставить его печатать все простые числа в диапазоне?Программа C не может отображать 3000 номеров

Вот программа:

#include <stdio.h> 
#include <math.h> 
#include <stdbool.h> 

main() 
{ 

     unsigned long long num, divisible_num; 

     printf("The prime numbers in the range of 1 - 3000 are: \n"); 
     for(num=1;num<=3000;num++) 
     { 
      for(divisible_num=2;divisible_num<=sqrt(num);divisible_num++) 
      {  
       if(num%divisible_num==0) 
        break; 
      } 
       if(num%divisible_num!=0) 
       { 
       printf("%lu\n", num); 
       } 
     } 
     getchar(); 
} 
+0

помнить одну вещь, как примечание стороны: - всегда дает пространство после ';', '' и 'а = b' должен быть' а = b' –

+0

Вы пробовали прокрутка в вашем терминале? Я запустил этот код и, конечно же, получил значения меньше 743 - вплоть до 1. Кроме того, этот код неправильно маркирует 2 как не простой, из-за того, как вы настроили свой цикл. – qaphla

+0

Вставить '--divisible_num' после' for() 'loop, перед внешним' if() ' –

ответ

1

Передовой, что нужно сделать, чтобы получить sqrt вызов из этого для цикла. Вы можете вычислить его один раз. А еще лучше, удалить все это вместе с

for(divisible_num=2;divisible_num * divisible_num<=num;divisible_num++) 

ряд является простым, если оно не делится на любой из простых чисел, меньших или равных в SQRT (NUM).

int prime = 1; 
for(divisible_num=2;divisible_num * divisible_num<=num;divisible_num++) { 
    if (num % divisible_num == 0) { 
     prime = 0; 
     break; 
    } 

} 

if (prime) { 
    //print the num 
} 

Ваш внешний контур также должен начинаться с 2

+0

правильное предложение, добавьте от меня в цикл for просто' <= num/2' достаточно..save executions. + –

1

Когда я запустил свой код он варьировался от 1-3000. Я не уверен, в чем проблема. Получить char() кажется немного неуместным.

Также, проверив два, вам больше не нужно делиться четными числами. Этот код работает от 3 - 3000

for(num=3;num<=3000;num++) 
    { 
     int prime = (num%2 != 0); 
     long root = sqrt(num); 
     for(divisible_num=3;prime && divisible_num <= root;divisible_num+=2) 
     {  
      if(num%divisible_num==0){ 
       prime = 0; 
      } 
     } 
      if(prime) 
      { 
      printf("%lu\n", num); 
      } 
    } 
+0

Приятно проверять только нечетные числа +1, но я предпочитаю 'prime && divisible_num <= root' вместо' divisible_num <= root && prime 'second, вам не нужно' break; 'в первом' if', потому что вы нажимаете условие на –

+0

Ах! Вы правы, я глупый. Ваши комментарии имеют смысл даже без объяснений. Спасибо! – CBIII

+0

Добавление 'getchar()' - общий трюк теми, кто запускает свои скомпилированные программы в Windows, дважды щелкнув по их значку. Окно исчезает после завершения работы программы. –

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