找到大于给定最小值的第一个质子斐波纳契数

时间:2013-01-18 20:28:30

标签: algorithm data-structures coding-style segmentation-fault

我正在尝试解决问题,但是遇到分段错误,无法找到问题 问题是你必须找到大于227000的第一个斐波纳契数,这也是一个素数,称之为X并返回X + 1的所有素数的除数

#include<iostream>
    int main(){
        int n = 227000;
        int prime[1000000];
        std::cout<<"lll";
        int i;
        for(i = 2; i<1000;i++){
            if(!prime[i]) continue;
            int j;
            for(j=i*i;j<1000000;j+=i){
                prime[j] = 0;
            }
        }
        int num = 1;
        int nextnum = 1;
        int newnum;
        while(1){
            newnum = num+nextnum;
            if(newnum>n && prime[newnum]) break;
            num = nextnum;
            nextnum = newnum;
        }
        int sum = 1;
        for(int i=2;i<1000000;i++){
            if(prime[i] && newnum%i==0){
                sum+=i;
            }
        }
        std::cout<<sum;
        return 0;

    }

3 个答案:

答案 0 :(得分:2)

您可能会遇到分段错误的一个原因是由于在堆栈上放置了100万个整数而导致堆栈溢出。

另一个原因是素数没有被初始化,所以while循环可能会走得太远而且访问超出数组极限的素数。

要解决此问题,您需要:

  1. 在堆上分配数组(或者只是将其更改为全局)
  2. 初始化您的素数数组以包含1的
  3. 如果while循环也可以保证终止,或者你可以访问超出边界的素数数组,那会更好。

    #include<iostream>
    int prime[1000000];
    int main(){
        int n = 227000;
        std::cout<<"lll";
        int i;
        for(i = 2; i<1000000;i++)
          prime[i]=1;
        for(i = 2; i<1000;i++){
            if(!prime[i]) continue;
            int j;
            for(j=i*i;j<1000000;j+=i){
                prime[j] = 0;
            }
        }
    
        int num = 1;
        int nextnum = 1;
        int newnum;
        while(1){
            newnum = num+nextnum;
            if(newnum>n && prime[newnum]) break;
            num = nextnum;
            nextnum = newnum;
        }
        int sum = 1;
        for(int i=2;i<1000000;i++){
            if(prime[i] && newnum%i==0){
                sum+=i;
            }
        }
        std::cout<<sum;
        return 0;
    
    }
    

    更新

    顺便说一句,第二个循环毫无意义地试图找到素数newnum的因子。

    我怀疑问题实际上是找到类似于代码将变为的数字(newnum + 1)的主要因素

        int sum = 0;
        for(int i=2;i<1000000;i++){
            if(prime[i] && (newnum+1)%i==0){
                sum+=i;
            }
        }
    

答案 1 :(得分:2)

我会创建一个循环来生成Fibonacci数,直到我发现一个大于输入的数字。然后我会检查每一个,看看它是否是素数。它比生成素数列表快得多。

#include<iostream>
#include<math.h>

bool isPrime(int number)
{
    for (int i=2;i<=sqrt(number);i++)
        if ((number%i)==0) return false;

    return true;
}


int main(){

    int n = 227000;

    int index=1;
    int nums[2];
    nums[0]=0;
    nums[1]=1;
    int currentFib = 0;

    while (currentFib <=n || !isPrime(currentFib))
    {
        //Calculate the next fib
        index = (index+1)%2;
        nums[index] = nums[0]+nums[1];
        currentFib = nums[index];
        cout<<"Fibb "<<currentFib<<endl;
    }

    return currentFib;
}

代码返回514229,它是素数和斐波纳契数,且大于227000。

答案 2 :(得分:0)

质数斐波纳契数在A005478给出。最小的斐波那契数字大于227000是514229.你可能会在我的博客上享受this entry