我正在尝试解决问题,但是遇到分段错误,无法找到问题 问题是你必须找到大于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;
}
答案 0 :(得分:2)
您可能会遇到分段错误的一个原因是由于在堆栈上放置了100万个整数而导致堆栈溢出。
另一个原因是素数没有被初始化,所以while循环可能会走得太远而且访问超出数组极限的素数。
要解决此问题,您需要:
如果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。