今天看到一個比較有意思的概念,叫做同構數。同構數是一個數字,它的平方數與數字本身的尾數相同。
例如,25是一個同構數,因為25的平方是625,它的結尾是25。同樣地,76是一個同構數,因為76的平方是5776,同樣以76結尾。
判斷一個數是否是同構數
有許多算法可以用來確定一個數字是否是同構,接下來我們選幾種來看看。
在數字上循環并進行比較
驗證一個數字是否同構大概有以下幾個步驟:
- 計算數字平方數
- 獲取平方數的最后一位數字并與數字的最后一位數字進行比較 如果最后一位數字不相等,則該數字不是一個同構數 如果最后一位數字相等,則進入下一步
- 刪除數字和平方的最后一位數字
- 重復步驟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;
}
在任何一個步驟,如果最后一位數字不相等,我們就返回false 。否則,我們就去掉最后一個數字,對number的剩余數字重復這個過程。
我們可以通過以下的代碼來驗證這個方法是否可行。
測試用例:
assertTrue(AutomorphicNumber.isAutomorphicUsingLoop(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingLoop(25));
直接比較數字
當然我們還可以用更直接的方法來確定一個數字是否是同構數。
- 得到數字并計算數字的位數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() 一次性得到 number 的總的 numberOfDigits 。然后通過使用 Math.pow() 從square提取盡可能多的數字。最后,我們將輸入的number與提取的數字lastDigits進行比較。
如果number和lastDigits相等,這個數字就是同構的,我們返回 true ,否則,我們返回 false 。
測試用例:
assertTrue(AutomorphicNumber.isAutomorphicUsingMath(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingMath(25));
總結
在這篇文章中,我們了解了什么是同構數,還學習了幾種確定一個數是否為同構數的方法,以及相應的Java程序。
-
數字
+關注
關注
1文章
1693瀏覽量
51302 -
代碼
+關注
關注
30文章
4779瀏覽量
68524 -
java程序
+關注
關注
0文章
12瀏覽量
7575
發布評論請先 登錄
相關推薦
評論