今天看到一個(gè)比較有意思的概念,叫做同構(gòu)數(shù)。同構(gòu)數(shù)是一個(gè)數(shù)字,它的平方數(shù)與數(shù)字本身的尾數(shù)相同。
例如,25是一個(gè)同構(gòu)數(shù),因?yàn)?5的平方是625,它的結(jié)尾是25。同樣地,76是一個(gè)同構(gòu)數(shù),因?yàn)?6的平方是5776,同樣以76結(jié)尾。
判斷一個(gè)數(shù)是否是同構(gòu)數(shù)
有許多算法可以用來確定一個(gè)數(shù)字是否是同構(gòu),接下來我們選幾種來看看。
在數(shù)字上循環(huán)并進(jìn)行比較
驗(yàn)證一個(gè)數(shù)字是否同構(gòu)大概有以下幾個(gè)步驟:
- 計(jì)算數(shù)字平方數(shù)
- 獲取平方數(shù)的最后一位數(shù)字并與數(shù)字的最后一位數(shù)字進(jìn)行比較 如果最后一位數(shù)字不相等,則該數(shù)字不是一個(gè)同構(gòu)數(shù) 如果最后一位數(shù)字相等,則進(jìn)入下一步
- 刪除數(shù)字和平方的最后一位數(shù)字
- 重復(fù)步驟2/3,直到數(shù)字的所有數(shù)字都得到比較
上述方法以相反的方式對(duì)輸入數(shù)字的數(shù)字進(jìn)行循環(huán)。
我們現(xiàn)在寫一個(gè)Java程序來實(shí)現(xiàn), isAutomorphicUsingLoop()
方法將一個(gè)整數(shù)作為輸入,并檢查它是否是同構(gòu)數(shù)。
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;
}
在任何一個(gè)步驟,如果最后一位數(shù)字不相等,我們就返回false 。否則,我們就去掉最后一個(gè)數(shù)字,對(duì)number的剩余數(shù)字重復(fù)這個(gè)過程。
我們可以通過以下的代碼來驗(yàn)證這個(gè)方法是否可行。
測(cè)試用例:
assertTrue(AutomorphicNumber.isAutomorphicUsingLoop(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingLoop(25));
直接比較數(shù)字
當(dāng)然我們還可以用更直接的方法來確定一個(gè)數(shù)字是否是同構(gòu)數(shù)。
- 得到數(shù)字并計(jì)算數(shù)字的位數(shù)n
- 計(jì)算數(shù)字的平方數(shù)
- 從平方數(shù)中得到最后的n個(gè)數(shù)字,如果平方數(shù)中的最后n個(gè)數(shù)字與原始數(shù)字相同,則該數(shù)字是同構(gòu)的,否則就不是同構(gòu)數(shù)
在這種情況下,我們不需要對(duì)數(shù)字的位數(shù)進(jìn)行循環(huán)。我們可以直接使用Math庫來完成數(shù)字的長度以及平方數(shù)的最后幾位的計(jì)算。
代碼示例:
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;
}
與第一種方法類似,我們先計(jì)算number的平方?,F(xiàn)在我們不是逐一比較number和square的最后一位數(shù)字,而是通過使用 Math.floor() 一次性得到 number 的總的 numberOfDigits 。然后通過使用 Math.pow() 從square提取盡可能多的數(shù)字。最后,我們將輸入的number與提取的數(shù)字lastDigits進(jìn)行比較。
如果number和lastDigits相等,這個(gè)數(shù)字就是同構(gòu)的,我們返回 true ,否則,我們返回 false 。
測(cè)試用例:
assertTrue(AutomorphicNumber.isAutomorphicUsingMath(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingMath(25));
總結(jié)
在這篇文章中,我們了解了什么是同構(gòu)數(shù),還學(xué)習(xí)了幾種確定一個(gè)數(shù)是否為同構(gòu)數(shù)的方法,以及相應(yīng)的Java程序。
-
數(shù)字
+關(guān)注
關(guān)注
1文章
1693瀏覽量
51311 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68625 -
java程序
+關(guān)注
關(guān)注
0文章
12瀏覽量
7575
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論