【发布时间】:2013-04-03 00:59:41
【问题描述】:
我正在尝试 Euler 项目的第 50 题。
素数41,可以写成六个连续素数之和:
41 = 2 + 3 + 5 + 7 + 11 + 13 这是连续的最长和 加到低于一百的素数上的素数。最长的总和 加到素数上的小于一千的连续素数包含 21 项,等于 953。100 万以下的质数可以是 写成最连续素数之和?
这是我的代码:
public class consPrime
{
static int checker(int ar[],int num,int index) //returns no.of consecutive
{ //primes for the given num
while(true)
{
int temp=num;
for(int i=index;i>=0;i--)
{
temp=temp-ar[i];
if(temp==0)
{
return (index-i+1);
}
}
index--;
if(index==0)
return 0;
}
}
public static void main(String args[])
{
int n=100000;
int ar[]=new int[n];
int total=0;int flag;
for(int i=2;i<1000000;i++) //Generates an array of primes below 1 million
{
flag=1;
for(int j=2;j<=Math.sqrt(i);j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1)
{
ar[total]=i;
total++;
}
}
int m=0;
int Big=0;
for(int i=total;i>=0;i--) //Prints the current answer with no.of prime
{
m=checker(ar,ar[i],i-1);
if(Big<=m)
{Big=m;
System.out.println(ar[i]+" "+Big);
}
}
}
}
基本上,它只是创建一个包含最多 1000000 的所有素数的向量,然后循环遍历它们以找到正确的答案。答案是 997651,计数应该是 543,但我的程序分别输出 990707 和 75175。可能有什么问题?
【问题讨论】:
-
您是否验证过您的素数数组已正确生成?您是否已验证您的
checker方法是否按您的预期工作?这个问题需要缩小范围。 -
我完全不确定你的程序是如何工作的。在这个循环中:
for(int i=total;i>=0;i--)当i变为0 时,对checker的调用将-1作为index传递。然后在checker方法中,此循环for(int i=index;i>=0;i--)以-1开头,您尝试检索ar[-1]。那时您没有收到Out Of Bounds异常吗? -
我运行程序时没有错误......它工作正常......但显然会产生错误的答案!