программа перестает отвечать, когда я запускаю цикл в C - PullRequest
0 голосов
/ 30 ноября 2019

Логика: я пытаюсь выполнить цикл от 3 до 100 и поместить все простые числа в этом диапазоне в массив. Я делаю это, сначала помещая 2 вручную в массив. После этого я перебираю все числа и, если число не делится на все простые числа, которые я добавил в массив, это простое число. Сама по себе логика, на мой взгляд, не совсем верна, но это домашняя проблема, и мне нужно делать это так, как этого хочет профессор. Поэтому я пытаюсь выполнить цикл, и он доходит до точки, и программа просто падает. Что я тут не так делаю?

    int primeNums_lessThan100[25] = {2}; //25 is the size here because there are only 25 prime numbers under 100.

    int primeNums_lessThan100_length = 1;
    for(int counter = 3 ; counter < 100 ; counter++)
    {
        printf("Entered here!\n");

        for(int array_idx = 0;  array_idx < primeNums_lessThan100_length ; array_idx++)
        {
            if(counter % primeNums_lessThan100[array_idx] != 0)
            {
                printf("Entered here, TOO!\n");
                primeNums_lessThan100[array_idx+1] = counter;
                primeNums_lessThan100_length++;
            }
            else
            {
                continue;
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 01 декабря 2019

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

Предположим, counter == 9, и вы проверяете его по первому элементу ваших «простых» чисел, который равен 2. Результат 9 % 2, конечно, 1, который не равен нулю, и ваша программа добавляет 9 к массиву как простое число. Это происходит даже раньше для counter == 4 - сначала выузнайте, что это делится на 2, и повторите цикл, чтобы узнать, на следующем шаге 4 % 3 != 0 и добавьте 4 к 'простым числам.

В качестве дальнейшего результатапереполнение массива (вы помещаете в него больше чисел, чем ожидали и объявляли; фактически вы помещаете в него каждое натуральное число, потому что каждое N больше 2 не делится на (N-1)), что означает, что вы в конце концов пишете после концамассива, вызывая, таким образом, неопределенное поведение.

Это также отображает основную ошибку в дизайне: вы не проверяете array_idx по размеру массива, что может позволить вам обработать ошибку в некоторых цивилизованныхобразом.

0 голосов
/ 01 декабря 2019

следующий предложенный код:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. комментарии в коде объясняют, что делается
  4. noteиспользование size_t для чисел, которые никогда не будут меньше 0
  5. Обратите внимание, что все предыдущие простые значения проверяются по testPrime
  6. Обратите внимание, что когда найдено простое число, оно помещаетсяв следующей доступной записи в массиве: `primeNums []

и теперь предлагаемый код:

 #include <stdio.h>  // puts(), printf()

 // eliminate ''magic' numbers by giving them meaningful names
 //25 is the size here because there are only 25 prime numbers under 100
 #define MAX_PRIMES 25
 #define TEST_LIMIT 100

 int main( void )
 {
    // declare prime number array and init to 0
    int primeNums[ MAX_PRIMES ] = {0};

    // pre-set first prime number
    primeNums[0] = 2;

    // init number of primes found
    size_t primeCount = 1;

    // test all values of interest
    for( int testPrime = 3 ; testPrime < TEST_LIMIT ; testPrime++ )
    {
        // init 'prime' indicator, 1 means value is prime
        size_t Prime = 1;

        for( size_t prime_idx = 0;  prime_idx < MAX_PRIMES; prime_idx++ )
        {
            // check that array of prime values contains a valid prime
            if( primeNums[ prime_idx ] )
            {
                if( testPrime % primeNums[ prime_idx ] == 0 )
                {
                    // indicate not a prime number
                    Prime = 0;
                }
            }

            else
            { // else, all previously found prime numbers checked
                break;
            } // end if 
        } // end for each prime already found

        if( Prime )
        { // then test number was prime
            // update the array of primes
            primeNums[ primeCount ] = testPrime;

            // update the count of primes found
            primeCount++;
        }
    }

    // display the found primes
    for( size_t i = 0; i < primeCount; i++ )
    {
        printf( "%d, ", primeNums[i] );
    }

    // assure the data gets displayed on the terminal before the program exits
    puts( "" );
}

выполнение предложенного кода приводит к:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,

...