为什么我的程序为100以下但不低于100万的所有素数之和生成正确的输出?

时间:2013-10-28 23:23:37

标签: java primes

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 个答案:

答案 0 :(得分: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个。

答案 1 :(得分:2)

您需要将所有素数加到一定数量以下。问题是你对“素数”的定义是“数字2,3,5,7以及所有不能用2,3,5或7除以余数的数字”,这是不正确的。

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

如果1和数字本身之间的所有数字(均被排除)给出了除数的余数,那么你就得到了一个素数。

如果您更改程序以使用此定义,则应获得正确的结果。

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

(也就是为什么它最多可以达到100的原因是因为你只需要测试小于数字的平方根(此处为10)的素数,而对于100则为2,3,5和7正是你的程序所做的。)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

问题在于这个条件:

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

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