Groovy编程练习题-2-质数/阿姆斯特朗数和水仙花数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011541946/article/details/81019373

      这一篇,找了一个常见的数学知识的编程题来用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



展开阅读全文

没有更多推荐了,返回首页