Java 中的 Niven 数程序

10 Sept 2024 | 4 分钟阅读

Niven数(尼文数)是以加拿大数学家Ivan Niven的名字命名的,他于1977年在一篇论文中首次介绍了它们。然而,印度数学家D. R. Kaprekar早在20世纪50年代就已经研究过它们。在本节中,我们将通过一个例子学习什么是Niven数以及Niven数Java程序

Niven数

Niven数是一个正整数,它可以被其各位数字之和整除。它也被称为Harshad数

Niven数的性质

Niven数有一些有趣的性质。例如,任何Niven数的各位数字之和本身也总是Niven数。此外,前n个Niven数的平均值总是等于(n + 1)/2

Niven数的用途

Niven数并不常见,但它们出现在各种数学环境中。例如,它们用于一些生成随机数的算法中。它们也用于一些数论问题,例如寻找大数的素因数分解。

Niven数示例

考虑数字18,并检查它是否是Niven数。

数字的各位数字之和 = 1 + 8 = 9。

因此,18可以被9整除。

所以,18是一个Niven数。

查找Niven数的步骤

  • 它计算数字的各位数字之和。该操作需要O(log n)的时间,其中n是数字中的位数。
  • 它检查该数字是否可以被其各位数字之和整除。该操作需要O(1)的时间。

因此,算法的整体时间复杂度为O(log n)。

算法:不使用字符串

  • 开始获取一个整数。这可以通过初始化一个数字或通过用户输入来完成。
  • 遍历数字的每一位。
  • 计算数字所有各位数字之和。
  • 在计算完所有各位数字之和后,检查原始数字是否能被各位数字之和整除。如果原始数字能被其各位数字之和整除,则该数字是Niven数,否则不是Niven数。

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

查找Niven数的Java程序

NivenNumber.java

输出

Given number:21
21 is a niven number

时间复杂度

给定代码的时间复杂度为O(log n),其中n是要检查的数字的位数。

代码中的while循环遍历数字的各位,循环次数等于数字的位数。一个数字的位数与其本身成对数关系,因此循环的时间复杂度为O(log n)。

函数中其余代码的运行时间是常数,因此函数的整体时间复杂度为O(log n)

算法2 使用字符串

  • 通过初始化或用户输入获取一个整数。
  • 使用toString()方法将整数转换为字符串。
  • 使用length()方法获取字符串的长度。
  • 使用for循环遍历字符串的每个字符,使用charAt(i)-'0'将每个字符转换为整数,并跟踪所有数字的总和。
  • 检查原始数字是否能被所有数字的总和整除。如果能整除,则给定的数字是Niven数。否则,它不是Niven数。

NivenNumberEaample.java

输出

Given number:40
40 is a niven number

给定代码的时间复杂度也为O(log n),其中n是要检查的数字的位数。