Почему эта программа не показывает число выше 3? - PullRequest
0 голосов
/ 23 февраля 2019

Написал это, чтобы найти простые числа от 2 до 1000.Но он останавливается после того, как показывает, что 2 и 3 являются простыми числами.Я знаю, что могу найти, как написать код для поиска простых чисел в Интернете.Но мне действительно нужно знать, что здесь происходит.

#include <stdio.h>

main() {
    int i, j;
    int ifPrime = 1;
    for (i = 2; i < 1000; i++) {
        for (j = 2; j < i; j++) {
            if (i % j == 0) {
                ifPrime = 0;
                break;
            }
        }
        if (ifPrime == 1) {
            printf("%d is prime\n", i);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вы не устанавливаете ifPrime обратно в 1 после проверки на один номер.Поэтому, как только вы получите число, не являющееся неотрицательным, ifPrime теперь равно 0, и, следовательно, if(ifPrime == 1) никогда не вернет истинное сообщение, и, следовательно, вы увидите только 2, 3 как простое

#include <stdio.h>

int main(void) {

    for( int i=2;i<1000;i++)
    {

        int ifPrime = 1;
        for(int j=2;j<i;j++)
        {   
            if(i%j==0)
            {
                ifPrime=0;
                break;
            }
        }
        if(ifPrime==1)
        {
            printf("%d is prime\n",i);
        }

    }
    return 0;
}
0 голосов
/ 23 февраля 2019

Линия

int ifPrime=1;

должна быть внутри внешней петли for.Там он будет инициализирован для каждого i.Это соответствует словам на естественном языке «чтобы проверить, является ли число i простым, сначала предположим, что оно есть. Затем проверьте, делится ли оно».Код, который вы использовали ранее, сказал «чтобы проверить, просты ли числа от 2 до 1000, сначала предположите, что они есть», и эта формулировка была слишком широкой.

Код должен быть:

int main()
{
    for (int i = 2; i < 1000; i++)
    {
        int ifPrime = 1;
        for (int j = 2; j < i; j++)

Я заменил main на int main, так как это требуется с 20 лет.(Вы не должны изучать программирование из таких старых книг.)

Я переместил int i и int j в циклы for, чтобы вы не могли случайно использовать эти переменные вне области, в которой они определенызначения.

Чтобы избежать этой ошибки в будущем, неплохо бы извлечь вычисление is_prime в отдельную функцию.Тогда вы были бы вынуждены инициализировать ifPrime в правильном месте.

Еще один способ найти причину этой ошибки - пройтись по коду с помощью отладчика и спрашивать себя на каждом шагу: делает ли он это?все еще имеет смысл, что делает программа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...