SebCG
SebCG

Reputation: 1

C++ Fibonacci Program

C++ Program help Hello, I am writing a c++ program to print out several fibonacci numbers that are prime. The program prints out 8 numbers but not only those that are prime. Can some please help me find out what is going on

#include <iostream>
#include <cmath>
using namespace std;

//fibonacci function
int fibonacci(int x) {
if ((x == 1) || (x == 2)) { return 1; }
return  fib(x - 1) + fib(x - 2);
}

 //prime test bool function

bool is_prime(double n) {
for (int i = 2; i <= sqrt(n); i++) {
    if (n % i != 0) { return true; }
    else { return false; }
}

}

// main function 
int main (){
int y = 1;
int c = 0;
while (y >= 0) {
fibonacci(y);

if ((is_prime(true)) && (fibonacci(y) != 1)) {
cout <<  fib(y) << " ";
count++;
if (c >= 8) { return 0; }
        }
y++;

} }

return 0; }


Upvotes: 0

Views: 2099

Answers (3)

VeminZ
VeminZ

Reputation: 78

Use Tim Biegeleisen answer for the issues in is_prime() function.

But additionally you do not check your Fibonacci number at all, is_prime is always being called with the same value is_prime(true). And apart of that, in current implementation while cycle will never finish. Try to consider following for the while loop:

while (y >= 0) {
    double fib = fibonacci(y);

    if ( is_prime(fib) && (fib != 1) ) {
        cout <<  fib << " ";
        c++;
        if (c >= 8) { return 0; }
    }
    y++;
}

Upvotes: 0

Shadi
Shadi

Reputation: 1771

Your code above uses double names for the function, and also you use c while you may mean count.

The is_prime function logic should take an int and the function logic is better to be rewritten to look for values that show if the number is not prime.

Lastly, using recursion with Fibonacci function is resource exhaustive. it is better to use plain loops.

check this code against yours:

#include <iostream>
#include <cmath>
using namespace std;

int fib(int x)
{
    int first = 0, second = 1, sum = 0;

    if ((x == 1) || (x == 2)) { return 1; }
    for (int i = 2; i <= x; ++i)
    {
        sum = first + second;
        first = second;
        second = sum;
    }

    return sum;
}

bool is_prime(int n) // n should be int not double
{
    for (int i = 2; i <= sqrt(n); i++)
        if (n % i == 0)
            return false; // you should look for what breaks the condition

    return true; // if nothing break the condition you return true
}

int main ()
{
    for (int i = 1; i <= 8; ++i)
    {
        int f = fib(i);
        if (is_prime(f))
            cout << f << " ";
    }
}

Upvotes: 1

Tim Biegeleisen
Tim Biegeleisen

Reputation: 520908

Your is_prime() function has a logical problem and appears to be returning the opposite evaluation for input numbers. Try the following:

bool is_prime(int n) {
    for (int i=2; i <= sqrt(n); i++) {
        // if input divisible by something other than 1 and itself
        // then it is NOT prime
        if (n % i == 0) {
            return false;
        }
    }
    // otherwise it is prime
    return true;
}

Here is a demo showing that the refactored is_prime() function is working correctly:

Rextester

Then you can use this function along with your Fibonacci number generator to find say the first 8 prime Fibonacci numbers:

int c = 0;
int y = 1;
do {
    int fib = fibonacci(y);
    ++y;
    if (is_prime(fib)) {
        cout << fib << " ";
        ++c;
    }
} while (c < 8);

As a side note, your fibonacci() function uses recursion and it won't scale well for large number inputs. Consider using dynamic programming there to dramatically improve performance.

Upvotes: 0

Related Questions