Как извлечь простые числа из ряда Фибоначчи в программе на языке Си?

#c #primes #fibonacci

Вопрос:

На моем университетском экзамене был вопрос о создании ряда FIB и извлечении ПРОСТЫХ чисел из результата. Я написал следующий код и получил правильный результат. Тем не менее, я уверен, что мой код не чист.. Может ли кто-нибудь помочь мне написать новый код или отредактировать мой и сделать его чистым?

 #include <stdio.h>

int main()
{
    int t1 = 0, t2 = 1, nextTerm = 0, n, i, position = 2, primeNumber[10], init = 2, count = 0;
    printf("Input N= ");
    scanf("%d", amp;n);

    printf("Fibonacci List: %d %d ", t1, t2);
    nextTerm = t1   t2;

    while (nextTerm <= n)
    {
        printf("%d ", nextTerm);
        primeNumber[position] = nextTerm;
        position  ;
        t1 = t2;
        t2 = nextTerm;
        nextTerm = t1   t2;
    }

    printf("nPrime numbers are ");
    position = 3;
    i = 1;
    init = 0;

    for (init = 1; init <= 7; init  )
    {
        for (i = 1; i <= primeNumber[position]; i  )
        {
            if (primeNumber[position] % i == 0)
            {
                count  ;
            }
        }
        if (count == 2)
        {
            printf("%d ", primeNumber[position]);
        }
        count = 0;
        position  ;
    }
    return 0;
}
 

Комментарии:

1. Вопрос лучше подходит для codereview.stackexchange.com

2. Ваш стиль отступов мог бы быть немного более последовательным 🙂

3. Эти моменты можно было бы улучшить: 1. четкое отступление. 2: не засовывать много объявлений переменных в одну строку. 3: не засовывайте весь свой код в main, а используйте функции. 4: проверка диапазона ввода для предотвращения доступа к исходному номеру за пределы.

4. Существует 51 известное простое число Фибоначчи. (Вы можете просто жестко закодировать их все). Однако ваш массив содержит только 10 элементов. На самом деле массив вам не нужен, потому что вы вычисляете только один элемент за раз, печатаете его и никогда к нему не возвращаетесь.

Ответ №1:

Во-первых, ваша программа работает не для меня. Он печатает список Фибоначчи, а затем прерывает работу. Другие вопросы:

  • Я не понимаю, откуда 7 берется в init <= 7 Код инициализируется init = 2 , затем выполняется init = 0 и, наконец, выполняется init = 1 непосредственно перед его использованием!
  • Ваша основная логика обнаружения выполняет больше работы, чем необходимо-она проверяет все делители, но тест заканчивается, как только найден первый делитель, нет необходимости проверять остальные. Вы также не можете ограничить делитель квадратным корнем, в конечном итоге вы проверяете все числа, меньшие целевого.
  • primeNumber[] массив действительно заполнен числами Фибоначчи, а не простыми числами, поэтому название вводит в заблуждение. В нем отсутствует проверка индекса, и, как отмечается в комментариях, в этом нет особой необходимости.

Вот альтернативный, упрощенный подход к проблеме:

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

int main()
{
    unsigned n, f1 = 0, f2 = 1;
    printf("Input N = ");
    scanf("%u", amp;n);

    printf("Fibonacci List: %d %d ", f1, f2);

    for (unsigned f3 = f1   f2; f3 <= n; f3 = f1   f2)
    {
        f1 = f2;
        f2 = f3;

        bool is_prime = true; // assume it's prime until proven otherwise

        for (unsigned divisor = 2; divisor * divisor <= f3; divisor  )
        {
            if (f3 % divisor == 0)
            {
                is_prime = false;
                break;
            }
        }

        if (f3 > 1 amp;amp; is_prime)
        {
            printf("[%d] ", f3);
        } else {
            printf("%d ", f3);
        }
    }

    printf("n");

    return 0;
}
 

выход

 % ./a.out
Input N = 10000
Fibonacci List: 0 1 1 [2] [3] [5] 8 [13] 21 34 55 [89] 144 [233] 377 610 987 [1597] 2584 4181 6765 
%
 

Где нет массива, поэтому он выводит числа Фибоначчи и простые числа за один проход, причем простые числа в последовательности обозначаются скобками.

Комментарии:

1. Спасибо вам за предложения и за правильное переписывание программы.