Java 为什么我的程序生成所有素数之和小于100,但不小于100万的正确输出? publicstaticvoidmain(字符串参数[]) { 长和=0; 对于(int i=0;i

Java 为什么我的程序生成所有素数之和小于100,但不小于100万的正确输出? publicstaticvoidmain(字符串参数[]) { 长和=0; 对于(int i=0;i,java,primes,Java,Primes,提示:您的问题将失败的最小素数是11。知道11是一个素数。序列继续:2、3、5、7、11、13、17、19、23,您的方法包括检查从1到目标平方根的所有素数,看看它们是否是目标范围内每个数字的因子 对于100的目标,这意味着查看1到100之间的每个数字,看看它是否可以被1到10(2,3,5和7)范围内的素数整除。正如您所发现的,这是有效的 对于1000000,您需要检查1到1000之间的所有素数,以查看它们是否是1到1000000之间每个数字的因子。您的代码仍然只检查1到10之间的素数 要使代码

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

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

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

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


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

问题在于这种情况:

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);
}

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

您需要将低于某个数字的所有素数相加。问题是您的定义“素数”的n是“数字2,3,5,7和所有不能用2,3,5或7除而不带余数的数字”,这是不正确的

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

如果所有介于1和数字本身之间的数字(两者都排除在外)都有一个带除法的余数,那么就有一个素数

如果将程序更改为使用此定义,则应得到正确的结果

(对于速度,你可以考虑如果你真的必须测试所有的数字,或者如果你只检查其中的一些也可以得到相同的结果)


(它最多可以工作到100的另一个原因是,您只需要测试小于数字平方根(这里是10)的素数,它们是2、3、5和7,这正是您的程序所做的).

这不是一种查找所有素数的有效方法-它将接受许多非素数。程序应该计算什么?也许你应该在if语句中包含更多的素数,而不仅仅是1、2、3、5和7,以便正确地得到更高数字的答案。我不明白上面的程序是如何检查素数的numbers@Ghostkee佩尔:哦,天哪……你在开玩笑吧?你需要在代码中更好地定义素数。素数的定义不是“任何不能被2、3、5或7整除的数”。如果你想使用这种方法,你应该明白,对于足够大的数,它将失败(大于您硬编码的最大素数的平方的数字)。至少,您应该检查您的输入是否小于这些太大的数字,如果是,则抛出一个
IllegalArgumentException
。或者更好的是,改进素数定义。我的程序在11时不会失败。如果我输入12(对12下的所有素数求和)它生成28,也就是2+3+5+7+11。这并不错误。你不明白……我该怎么解释?试着用11*11。我需要彻底重新考虑我的方法来解决这个问题吗?@user换句话说,你的程序认为121是素数,但这并不是因为它可以被11整除(不要只在列表中添加11,素数的数量是无限的)尝试确定一个数字是否是素数的方法是好的。除非你实现了错误。你只检查除数2、3、5和7。你还需要检查所有较高的除数。在for循环中测试这一点。
if(i != 1 && i%2 != 0 && i%3 != 0 && i%5 != 0 && i%7 != 0)