Groovy程式設計練習題-2-質數/阿姆斯特朗數和水仙花數
阿新 • • 發佈:2019-01-02
這一篇,找了一個常見的數學知識的程式設計題來用groovy語言程式設計練習一下,先要了解這個數學概念,然後才能去想辦法去程式碼實現。本篇學習質數和水仙花數的判斷原理。
1.質數
什麼是質數,自己去百度素數就知道
package exercises class IsPrimes { static main(args) { println isPrimeNumber(41); } static boolean isPrimeNumber(int a) { def result = true; for(int i = 2; i < a ; i++) { //質數或者叫素數的含義是,大於1的自然數,只能被1和自己整除。 if( a % i == 0) { result = false; break; } } return result; } }
2.阿姆斯特朗數
首先,你要百度一下,查一下什麼是阿姆斯特朗數:如果一個n位正整數等於其各位數字的n次方之和,則稱該數為阿姆斯特朗數。相關程式碼如下:
package demo class Demo2_ArmstrongNumber { static main(args) { println isArmstrongNumber(153) } static boolean isArmstrongNumber(int number) { def result = false; // 原始數 def originalNumber = number; // 數的長度 def numberOfDigits = String.valueOf(number).length() def sum = 0 while( number > 0) { //求出number的個位數 int digit = number % 10 sum = sum + Math.pow(digit, numberOfDigits) number = number / 10 } result = sum == originalNumber return result } }
跟這個題目相關的一道程式設計練習題,就是求出在1000範圍之內的全部水仙花數。如果把阿姆斯特朗數的長度限定在三位數就是水仙花數,當然,我們在網上看到的水仙花數一般都是以下程式碼的邏輯。
package demo class Demo2_ArmstrongNumber { static main(args) { def int number,ge, shi,bai //迴圈100到1000內的整數,一個一個去判斷是否是水仙花數 for(number =100; number < 1000; number++) { //分別定義三個變數來儲存各位 十位 百位的數字 ge = number % 10 shi = (number /10)%10 bai = number /100 //進行是否水仙花數判斷 if (number == ge*ge*ge + shi*shi*shi + bai*bai*bai) { println number } } } }
但是,執行上面程式碼出現異常,很奇怪,java語言這麼寫可以計算出水仙花數,在groovy就不行。
Caught: java.lang.UnsupportedOperationException: Cannot use mod() on this number type: java.math.BigDecimal with value: 10
java.lang.UnsupportedOperationException: Cannot use mod() on this number type: java.math.BigDecimal with value: 10
at demo.Demo2_ArmstrongNumber.main(Demo2_ArmstrongNumber.groovy:12)
錯誤行在求十位數字上面,下面我們再追加一個變數shi2,一行程式碼拆分兩行寫就可以。
package demo
class Demo2_ArmstrongNumber {
static main(args) {
def int number,ge, shi1,shi2,bai
//迴圈100到1000內的整數,一個一個去判斷是否是水仙花數
for(number =100; number < 1000; number++) {
//分別定義三個變數來儲存各位 十位 百位的數字
ge = number % 10
shi1 = (number /10)
shi2 = shi1 % 10
bai = number /100
//進行是否水仙花數判斷
if (number == ge*ge*ge + shi2*shi2*shi2 + bai*bai*bai) {
println number
}
}
}
}
執行輸出:
153
370
371
407