-1
public static void main(String args[])
{
    long sum = 0;
    for(int i=0; i<Integer.parseInt(args[0]); i++)
    {
        if(i != 1 && i%2 != 0 && i%3 != 0 && i%5 != 0 && i%7 != 0)
        {
            sum = sum + i;          
        }
        if(i==2 || i==3 || i==5 || i==7)
        {
            sum = sum + i;
        }

    }
    System.out.println(sum);
}

每当我插入 100 时,它都会生成 1060,这是正确的。但是,它会生成错误的数字 1,000,000 (114,285,285,737)。

它为100以下的所有值正确生成,没有尝试过其他任何东西。我不只是检查 100。

4

4 回答 4

3

您的方法包括检查从 1 到目标平方根的所有素数,以查看它们是否是目标范围内每个数字的因数。

对于 100 的目标,这意味着查看 1 到 100 之间的每个数字,看它是否可以被 1 到 10(2、3、5 和 7)范围内的素数整除。正如您所发现的,这是可行的。

对于 1,000,000,您需要检查 1 到 1000 之间的所有素数,看看它们是否是 1 到 1,000,000 之间每个数字的因数。您的代码仍然只检查 1 到 10 之间的素数。

为了使您的代码工作,扩展您的列表以包括 1 到 1000 之间的所有素数 - 其中有 168 个。

于 2013-10-28T23:38:06.470 回答
2

您需要将某个数字以下的所有质数相加。问题是您对“素数”的定义是“数字 2,3,5,7 以及所有不能与 2,3,5 或 7 相除而没有余数的数字”,这是不正确的。

素数的正确定义是“素数(或素数)是一个大于 1 的自然数,除了 1 和它本身之外没有正因数”。(维基百科)。因此,这需要成为您的测试,而不是您当前的测试。

如果 1 和数字本身之间的所有数字(均不包括在内)给出除法余数,则您有一个素数。

如果你改变你的程序来使用这个定义,你应该得到正确的结果。

(为了速度,您可以考虑是否真的必须测试所有数字,或者您是否可以通过仅检查其中一些数字来获得相同的结果)

(也是它工作到 100 的原因是因为您只需要测试小于数字平方根(此处为 10)的素数,而 100 的素数是 2、3、5 和 7,这正是您的程序确实)。

于 2013-10-29T00:02:39.323 回答
0

提示:您的问题将失败的最小素数是 11。知道 11 是素数。系列赛继续:2、3、5、7、11、13、17、19、23、...

于 2013-10-28T23:32:43.857 回答
0

问题在于这种情况:

if(i != 1 && i%2 != 0 && i%3 != 0 && i%5 != 0 && i%7 != 0)

正如其他人所说,这不是检查数字是否为素数的有效方法。您的程序似乎可以工作的原因是,例如,209 不能被 2、3、5 或 7 整除,但 209 是 11 * 19,它不是素数。

于 2013-10-28T23:42:23.990 回答