Java中的自同构数
1. 概述
在这个简短的教程中,我们将讨论自同构数,并学习几种与 Java 程序一起找到它们的方法。
2.什么是自同构数?
自同构数是一个数,其平方的末尾与数本身相同。
例如,25 是一个自同构数,因为 25 的平方是 625,它以 25 结尾。类似地,76 是一个自同构数,因为 76 的平方是 5776,它又以 76 结尾。
在数学中,自同构数也称为循环数。
自同构数的更多示例是 0、1、5、6、25、76、376、625、9376 等。
0 和 1 被称为平凡自同构数,因为它们是每个基数的自同构数。
3. 判断一个数是否自守
有许多算法可用于确定一个数是否是自守的。接下来,我们将看到几种方法。
3.1. 循环数字并进行比较
这是确定数字是否自守的一种方法:
- 获取数字并计算其平方
- 获取正方形的最后一位,并将其与数字的最后一位进行比较
- 如果最后一位不相等,则该数字不是自同构数
- 如果最后一位数字相等,则进行下一步
- 删除数字和平方的最后一位
- 重复步骤 2 和 3,直到数字的所有数字都被比较
上述方法以相反的方式循环输入数字的数字。
让我们编写一个 Java 程序来实现这种方法。*isAutomorphicUsingLoop()*方法将一个整数作为输入并检查它是否是自守的:
public boolean isAutomorphicUsingLoop(int number) {
int square = number * number;
while (number > 0) {
if (number % 10 != square % 10) {
return false;
}
number /= 10;
square /= 10;
}
return true;
}
在这里,我们首先计算number的平方。然后,我们遍历 number 的数字并将其最后一位与square的最后一位进行逐一比较。
在任何阶段,如果最后一位数字不相等,我们将返回false并退出该方法。否则,我们去掉相同的最后一位数字,并对number的剩余数字重复该过程。
让我们测试一下:
assertTrue(AutomorphicNumber.isAutomorphicUsingLoop(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingLoop(9));
3.2. 直接比较数字
我们还可以以更直接的方式确定一个数是否是自守的:
- 获取数字并计算位数(n)
- 计算数字的平方
- 从正方形中
获取最后n 个 数字
- 如果正方形的最后n位是原始数字,则该数字是自守的
- 否则它不是一个自同构数
在这种情况下,我们不需要遍历数字的数字。相反,我们可以使用编程框架的现有库。
我们可以利用Math 类来执行数字运算,例如计算给定数字中的数字并从其平方中获取许多最后的数字:
public boolean isAutomorphicUsingMath(int number) {
int square = number * number;
int numberOfDigits = (int) Math.floor(Math.log10(number) + 1);
int lastDigits = (int) (square % (Math.pow(10, numberOfDigits)));
return number == lastDigits;
}
与第一种方法类似,我们从计算number的平方开始。然后,我们不是逐个比较number和square的最后一位,而是使用Math.floor() 一次获得numberOfDigits的总数。之后,我们使用Math.pow() 从正方形中提取尽可能多的数字。最后,我们将输入的数字与提取的数字lastDigits进行比较。
如果number和lastDigits相等,则该数字是自同构的,我们返回true,否则,我们返回false。
让我们测试一下:
assertTrue(AutomorphicNumber.isAutomorphicUsingMath(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingMath(9));