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.
答案 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,这是不素数。