2016-04-05 1 views
0

Пожалуйста, помогите моему коду в следующем. Я нашел серии Фибоначчи в диапазоне успешно, но мне трудно извлечь простые числа из серии Фибоначчи. Кажется, что в части простых чисел появилось много ошибок. Пожалуйста помоги. БлагодаряКак извлечь простые числа из ряда фибоначчи в C++?

#include<iostream.h> 
#include<conio.h> 

void main() 
{ 
    clrscr(); 
    int n, c, first = 0, second = 1, next, flag; 

    cout << "Enter the number of terms of Fibonacci series you want" << endl; 
    cin >> n; 

    cout << "First " << n << " terms of Fibonacci series are :- " << endl; 

    for (c = 0; c < n; c++) 
    { 
    if (c <= 1) 
     next = c; 
    else 
    { 
     next = first + second; 
     first = second; 
     second = next; 
    } 
    cout << next << endl; 
    for (int j = 2; j<next; j++) 
    { 
     if (next%j == 0) 
     { 
     flag++; 
     } 
     if (flag == 0) 
     { 
     cout << "Prime numbers are" << next << "\t"; 
     } 
    } 
    getch(); 
    } 
} 

ответ

3

Дополнение Rolland упоминает, я отредактирован так, что SQRT вычисляется только один раз, и о 1 не является простым, глупый меня
Проверка на прайм

#include <math.h>  
bool isPrime(int n) 
{ 
    if (n <= 1) return false; 
    if (n == 2 || n == 3) return true; 
    int checkRange = sqrt(n); 
    for (int i = 2; i <= checkRange; i++) 
    { 
     if (n % i == 0) 
      return false; 
    } 
    return true; 
} 

Вы затем хранить их в коллекции и использовать другой цикл, чтобы распечатать его

#include <vector> //Include this - vector is a standard c++ container 

//Declare in your function 
std::vector<int> primes; 

//In your code where you get your next fibbonacci 
if (isPrime(next)) 
    primes.push_back(next); 

//After you finished looping for fibbonacci 
cout << endl << "Prime numbers are" << endl; 
for (int i = 0; i < primes.size(); i++) 
    cout << primes[i] << " "; 

обновления по запросу OP: Fullcode, нет вектора
Примечание: при извлечении простых чисел, чтобы вывести их отдельно с помощью фибоначчи, вы должны где-то их хранить. Поскольку вы не используете вектор, я собираюсь реализовать это с помощью массива.
Проблема с массивом заключается в том, что вы должны объявить их с размером, но вы не знаете, сколько простых чисел вы получите в тот момент, когда вы его еще объявите. Таким образом, вы должны объявить массив с размером достаточно большим, чтобы вместить все простые числа в вашем fibbonacci

#include <iostream> 
#include <math.h> 
#define MAX 100 
using namespace std; 
bool isPrime(int n) 
{ 
    if (n <= 1) return false; 
    if (n == 2 || n == 3) return true; 
    int checkRange = sqrt(n); 
    for (int i = 2; i <= checkRange; i++) 
    { 
     if (n % i == 0) 
      return false; 
    } 
    return true; 
} 
void main() 
{ 
    int n, c, first = 0, second = 1, next, primeCount = 0; 
    int primes[MAX]; 

    cout << "Enter the number of terms of Fibonacci series you want" << endl; 
    cin >> n; 

    cout << "First " << n << " terms of Fibonacci series are :- " << endl; 

    for (c = 0; c < n; c++) 
    { 
     if (c <= 1) 
      next = c; 
     else 
     { 
      next = first + second; 
      first = second; 
      second = next; 
     } 

     cout << next << endl; 

     if (isPrime(next)) //Reuse the above isPrime 
     { 
      primes[primeCount] = next; 
      primeCount++; 
     } 
    } 

    for (c = 0; c < primeCount; c++) 
     cout << primes[c] << " "; 
} 
+1

1 не является простым, и 'sqrt' занимает много времени, чтобы вычислить, поэтому она должна быть только сделано один раз. Кроме этого, очень приятно. :) –

+0

Спасибо @nmtuan. Но мы можем сделать это без vector.Would будет более хорошим, если вы предоставляете полную программу cpp. –

+0

Вероятно, можно было бы предпочесть 'i + = 2', так как бессмысленно проверять, имеет ли число четный делитель – YakovL