Java 中的 3N+1 问题

17 Mar 2025 | 4 分钟阅读

3N+1 问题是一个抽象的数学问题,它是一个猜想(尚未被证明)。它也被称为考拉兹猜想 (Collatz problem)。在本节中,我们将讨论 3N+1 问题及其 Java 程序。

任务是编写一个 Java 程序,该程序将从用户那里读取一个正整数,并从该整数开始打印 3N+1 序列。程序还应该计算并打印序列中的项数。

寻找 3N+1 序列

给定一个正整数 N,从 N 开始定义的 3N+1 序列如下:

  • 如果 N 是偶数,则将 N 除以二。
  • 如果 N 是奇数,则将 N 乘以 3 并加 1。
  • 继续以这种方式生成数字,直到 N 等于 1。

在数学上,我们可以将 3N+1 问题定义如下:

3N+1 Problem in Java

让我们通过一个例子来理解问题陈述。

假设 N = 3,这是一个奇数。根据上述规则,将 N 乘以 3 并加 1,我们得到 N = 3*3+1 = 10。因此,N 变成了一个偶数。现在,将 N 除以 2。得到 N = 10/2 = 5。继续这个过程,直到 N 等于 1。因此,3N+1 序列将是 3, 10, 5, 16, 8, 4, 2, 1

3N+1 问题算法

为了计算下一个项,程序必须根据 N偶数 还是 奇数 来采取不同的操作。为此,我们需要一个 if 语句来判断 N 是偶数还是奇数。

剩下的一个问题是计数。计数意味着我们从零开始,每当我们有什么东西需要计数时,我们就加 1。我们需要一个变量(例如 count)来进行计数。

我们仍然需要考虑第一步。如何从用户那里获取一个正整数?如果我们只是读取一个数字,用户可能会输入一个负数或零。如果我们观察 N 为负数或零时会发生什么,我们会发现程序将永远运行下去,因为 N 的值永远不会变成 1,这是不兼容的。

在这种情况下,问题可能不大,但总的来说,我们应该尽量编写防错程序。一种解决方法是持续读取数字,直到用户输入一个正数为止。

第一个 while 循环将在 N 是正数时结束,正如要求的那样。如果 N 不是正数,则要求用户输入另一个值。如果用户输入的第二个数字也是非正数,则会出现问题。if 语句只执行一次,因此第二个输入数字从未被测试。

使用 while 循环,在输入第二个数字后,计算机将跳回到循环的开头,并测试第二个数字是否为正数。如果不是,它将要求用户输入第三个数字,并且将继续要求输入数字,直到用户输入可接受的输入为止。

让我们在 Java 程序中实现上述算法。

3n+1 问题 Java 程序

ThreeNPlusOneProblem.java

输出

3N+1 Problem in Java