Autobiographical Number in Java

2025年5月5日 | 阅读 4 分钟

在本节中,我们将学习什么是自传数,并创建Java 程序来检查给定的数字是否是自传数。Java 编码测试中经常会问到自传数程序,以测试程序员的逻辑能力。

自传数

一个数字计数精确地说明了数字 0 到 9 在数字中出现的频率。换句话说,一个数字是一个浮夸而自私的数字,它存在的唯一目的是描述自己。

我们可以正式地将自传数定义为

一个自传数是一个数字(N),使得 N 的第一个数字统计 N 中有多少个零,第二个数字统计 N 中有多少个一,第三个数字统计 N 中有多少个二,依此类推。有时,它也被称为奇数。它是 OEIS A046043 序列。

它就像自描述素数,它使用不同的方法 OEIS A108810 来描述自描述素数。两者唯一的区别在于,在自传数中,数字以递增顺序描述,而自描述素数的数字可以以任何顺序描述。

只有一个数字10213223描述了它自己。我们观察到 0 的频率是 1,1 的频率是 2,2 的频率是 3,3 的频率是 2。因此,10213223是唯一一个描述自己的数字。最小的自传数是1210

自传数示例

假设,我们要检查数字21200是否是自传数。

首先,找出其数字之和 (2+1+2+0+0),即 5,并计算给定数字的位数,即 5。我们观察到两者相等。因此,数字 21200 是一个自传数

注意:上面讨论的方法仅在数字之和小于 10 时才有效。

让我们再看一个数字1210。它有 1 个零,2 个一,1 个二和 0 个三。因此,数字 21200 是一个自传数

上述方法适用于所有数字。

一些自传数有:1210, 2020, 21200, 3211000, 42101000, 521001000, 6210001000.

查找自传数的步骤

对于数字中存在的每个从 0 到 9 的数字,写下该数字的频率,然后是该数字。写下频率和数字后,我们得到的数字称为自传数

让我们使用放大方法找出所有自传数。

  1. 根据上述描述,自传数不能超过 10 位。因此,很明显自传数不会太大。
  2. 在自传数中,数字之和等于数字的位数。请记住,数字之和不应超过 10。例如,2020。
  3. 正如我们上面讨论的,第一个数字统计 0 的频率。我们也知道自描述数字不以零开头。因此,零的数量不为零。
  4. 将上面的步骤 3 从步骤 2 中减去,我们得到一个结果语句,即除第一个数字外,所有数字的总和等于非零数字的数量加 1。
  5. 这意味着除了第一个数字外,所有其他非零数字的集合由几个 1 和一个 2 组成。
  6. 特别地,在自传数中,1 的数量为 0、1 或 2。

现在我们将根据 1 的数量以三种不同的方式使用放大方法。在本节中,我们只考虑数字中没有 1 的情况。

  • 如果 1 的数量为零,则此类数字中唯一的非零非首位数字将为 2。
  • 该数字(即 2)将包含在自传数中。因此,该数字的第三位数字不会为零。因为它将是 2。
  • 该数字包含两个 2。
  • 因此,自传数将是 2020。

让我们在 Java 程序中实现上述逻辑。

自传数 Java 程序

AutobiographicalNumberExample.java

输出 1

Enter the number you want to check: 1210
1210 is an Autobiographical Number.

输出 2

Enter the number you want to check: 2120001
2120001 is not an autobiographical number.