1. 程式人生 > >Groovy程式設計練習題-2-質數/阿姆斯特朗數和水仙花數

Groovy程式設計練習題-2-質數/阿姆斯特朗數和水仙花數

      這一篇,找了一個常見的數學知識的程式設計題來用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