今天看到一個比較有意思的概念,叫做同構(gòu)數(shù)。同構(gòu)數(shù)是一個數(shù)字,它的平方數(shù)與數(shù)字本身的尾數(shù)相同。
例如,25是一個同構(gòu)數(shù),因?yàn)?5的平方是625,它的結(jié)尾是25。同樣地,76是一個同構(gòu)數(shù),因?yàn)?6的平方是5776,同樣以76結(jié)尾。
判斷一個數(shù)是否是同構(gòu)數(shù)
有許多算法可以用來確定一個數(shù)字是否是同構(gòu),接下來我們選幾種來看看。
在數(shù)字上循環(huán)并進(jìn)行比較
驗(yàn)證一個數(shù)字是否同構(gòu)大概有以下幾個步驟:
- 計算數(shù)字平方數(shù)
- 獲取平方數(shù)的最后一位數(shù)字并與數(shù)字的最后一位數(shù)字進(jìn)行比較 如果最后一位數(shù)字不相等,則該數(shù)字不是一個同構(gòu)數(shù) 如果最后一位數(shù)字相等,則進(jìn)入下一步
- 刪除數(shù)字和平方的最后一位數(shù)字
- 重復(fù)步驟2/3,直到數(shù)字的所有數(shù)字都得到比較
上述方法以相反的方式對輸入數(shù)字的數(shù)字進(jìn)行循環(huán)。
我們現(xiàn)在寫一個Java程序來實(shí)現(xiàn), isAutomorphicUsingLoop()
方法將一個整數(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;
}
在任何一個步驟,如果最后一位數(shù)字不相等,我們就返回false 。否則,我們就去掉最后一個數(shù)字,對number的剩余數(shù)字重復(fù)這個過程。
我們可以通過以下的代碼來驗(yàn)證這個方法是否可行。
測試用例:
assertTrue(AutomorphicNumber.isAutomorphicUsingLoop(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingLoop(25));
直接比較數(shù)字
當(dāng)然我們還可以用更直接的方法來確定一個數(shù)字是否是同構(gòu)數(shù)。
- 得到數(shù)字并計算數(shù)字的位數(shù)n
- 計算數(shù)字的平方數(shù)
- 從平方數(shù)中得到最后的n個數(shù)字,如果平方數(shù)中的最后n個數(shù)字與原始數(shù)字相同,則該數(shù)字是同構(gòu)的,否則就不是同構(gòu)數(shù)
在這種情況下,我們不需要對數(shù)字的位數(shù)進(jìn)行循環(huán)。我們可以直接使用Math庫來完成數(shù)字的長度以及平方數(shù)的最后幾位的計算。
代碼示例:
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的平方?,F(xiàn)在我們不是逐一比較number和square的最后一位數(shù)字,而是通過使用 Math.floor() 一次性得到 number 的總的 numberOfDigits 。然后通過使用 Math.pow() 從square提取盡可能多的數(shù)字。最后,我們將輸入的number與提取的數(shù)字lastDigits進(jìn)行比較。
如果number和lastDigits相等,這個數(shù)字就是同構(gòu)的,我們返回 true ,否則,我們返回 false 。
測試用例:
assertTrue(AutomorphicNumber.isAutomorphicUsingMath(76));
assertFalse(AutomorphicNumber.isAutomorphicUsingMath(25));
總結(jié)
在這篇文章中,我們了解了什么是同構(gòu)數(shù),還學(xué)習(xí)了幾種確定一個數(shù)是否為同構(gòu)數(shù)的方法,以及相應(yīng)的Java程序。
-
數(shù)字
+關(guān)注
關(guān)注
1文章
1694瀏覽量
51415 -
代碼
+關(guān)注
關(guān)注
30文章
4835瀏覽量
69117 -
java程序
+關(guān)注
關(guān)注
0文章
12瀏覽量
7591
發(fā)布評論請先 登錄
相關(guān)推薦
基于Iceberg概念格疊置半集成的全局閉頻繁項集挖掘算法
labview尋找同構(gòu)數(shù),你準(zhǔn)備好了嗎?
labview同構(gòu)數(shù)最快和最小VI程序展示
步進(jìn)電機(jī)相關(guān)參數(shù)的概念是什么?
介紹步進(jìn)電機(jī)使用的幾個概念
加性細(xì)胞自動機(jī)的同構(gòu)性分析
由跨導(dǎo)運(yùn)放和普通運(yùn)放共同構(gòu)成的壓控均衡器
![由跨導(dǎo)運(yùn)放和普通運(yùn)放共<b class='flag-5'>同構(gòu)</b>成的壓控均衡器](https://file1.elecfans.com//web2/M00/A4/50/wKgZomUMM6SATNKzAAKh17dng5M628.jpg)
對同構(gòu)和異構(gòu)設(shè)計的再思考
前端同構(gòu)MVC實(shí)踐分析
基于導(dǎo)數(shù)序列的時間序列同構(gòu)關(guān)系
![基于導(dǎo)數(shù)序列的時間序列<b class='flag-5'>同構(gòu)</b>關(guān)系](https://file.elecfans.com/web2/M00/49/7C/poYBAGKhwLyAOxCnAAARJUnZkbg916.jpg)
計及無功潮流影響的傳輸介數(shù)概念
![計及無功潮流影響的傳輸介<b class='flag-5'>數(shù)</b><b class='flag-5'>概念</b>](https://file.elecfans.com/web1/M00/46/7A/o4YBAFqeZQqAP1lPAACJk5APtNI965.jpg)
FPGA產(chǎn)生基于LFSR的偽隨機(jī)數(shù)概念
![FPGA產(chǎn)生基于LFSR的偽隨機(jī)<b class='flag-5'>數(shù)</b><b class='flag-5'>概念</b>](https://file.elecfans.com/web1/M00/E9/4C/pIYBAGBm2F-ATqHfAAAYPC4Ib2c890.png)
邏輯復(fù)制的概念與原理
多核同構(gòu)SMP--調(diào)度算法分析
![多核<b class='flag-5'>同構(gòu)</b>SMP--調(diào)度算法分析](https://file1.elecfans.com/web2/M00/8C/5B/wKgZomSrdxmAEzLiAAAmTO8GKfw794.png)
評論