【问题标题】:Program to find Prime numbers. Chapter 2 Self test schildt java beginner's guide寻找素数的程序。第2章自测schildt java初学者指南
【发布时间】:2019-03-19 09:31:01
【问题描述】:

在 Schildt 的 Java 初学者指南第 2 章的自测中,有一个练习可以编写一个程序来查找 2 到 100 之间的所有素数。

作者给出的正确答案如下:

class Prime {
    puЬlic static void main(String args[]) {
        int i, j;
        boolean isprime;
        for(i=2; i < 100; i++) {
            isprime = true;
            for (j=2; j <= i/j; j++)
                if((i%j) == 0) isprime = false;
            if (isprime)
                System.out.println(i +" - is a prime number."); 
        }
    }
}

我不能理解两件事

1) 第二个 FOR 循环的条件:

j <= i/j;

这是某种寻找素数的数学算法吗?

我的条件版本看起来像

j < i;

2) 如果在第二个循环的条件下使用i &lt;= j 而不是i &lt; j,那么程序的输出将为空。为什么?

感谢您的帮助!

第二个问题的解释:

当我解决这个问题时,依靠“我的”版本的素数定义,我的代码如下所示:

for(i=2; i < 100; i++) {
            isprime = true;
            for (j=2; j <= i; j++)
                if((i%j) == 0) isprime = false;
            if (isprime)
                System.out.println(i +" - is a prime number."); 
        }

注意第二个循环的情况: 我

如果你依赖“我的”对素数的定义,那么条件中的等号应该是。

尝试运行程序。输出将为空。

但是如果条件去掉了等号for (j=2; j &lt; i; j++),程序就可以正常工作了。

是什么原因?

【问题讨论】:

  • 你确定你放的是 j
  • @Mwak 是的,如果我选择i &lt;= j,我确定应该是j &lt;= i;,那么第二个循环将是无限的。第一次迭代:i = 2; j = 2,循环进入下一次迭代第二次迭代:i = 2; j = 3,条件i &lt;= j 为真,循环进入下一次迭代第三次迭代:i = 2; j = 4,条件i &lt;= j 为真,循环进入下一次迭代... ...
  • 知道了,我编辑了我的答案来解释发生了什么。

标签: java primes


【解决方案1】:

让我们关注这些for 循环。

        for(i=2; i < 100; i++) {
            isprime = true;
            for (j=2; j <= i/j; j++)
                if((i%j) == О) isprime = false;
            if (isprime)
                System.out.println(i +" - is a prime number."); 
        }

第一个循环遍历您要测试的所有数字。很容易理解,它只是告诉“我想对从 2 到 100 的所有数字执行以下测试”。

for (j=2; j <= i/j; j++)
    if((i%j) == О) isprime = false;

现在这个循环是纯数学的。 在数学上,一个素数:

是大于 1 的自然数,不能由 将两个较小的自然数相乘。

(来源:维基百科)

因此,您遍历所有乘以将形成 i 的数字。

但是你真的需要吗? 例如,如果 i = 3*25,是否需要一直迭代到 25 才能知道 i 不是质数?

答案显然是否定的,因为在测试 j=3 之后,您已经知道 i 是合数。

在数学上,存在多种算法来检查一个数是素数还是合数。但一种相当正确的方法是检查一个数是否是any number between 2 and its own square root 的倍数。您正在执行此操作的综合版本。

由于上述原因,检查 2 和 i 之间的所有数字是多余的。

编辑:回答 2)

使用时

for (j=2; j <= i; j++)
    if((i%j) == 0) isprime = false;

您是在告诉编译器j==i 执行测试后停止循环。当然,当 j 等于 i 时,(i%j) == 0 总是计算为真。

在非信息术语中,您正在检查一个数字是否由 任何数字组成,不包括 1,包括它自己,而您应该检查它是否由 任何数字组成,不包括1 和它自己

这是由于 Java 实现 for 循环的方式:they stop when the middle condition evaluates to false.

【讨论】:

  • 谢谢!现在很清楚了。我们在学校学到的素数的定义是这样的(直译):一个简单的数字是一个自然(正整数)数,它有两个不同的自然除数——一个单位和它自己。与英文版的素数定义有点不同,同意吗? :) 我将用以下评论解释我的第二个问题。
  • 在主帖中添加了对第二个问题的解释
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2016-08-10
相关资源
最近更新 更多