首页 > 代码库 > Java杂谈之二----怎样判断一个数是水仙花数以及穷举水仙花数

Java杂谈之二----怎样判断一个数是水仙花数以及穷举水仙花数

首先明确一下什么是水仙花数

百度说,水仙花数指一个n位数(n>=3),它的每个位上的数字的n次幂之和等于它本身

例如:1^3+5^3+3^3=153

水仙花数只是自幂数的一种,严格来说三位数的3次幂数才能成为水仙花数。

但其实也分一位自幂数,两位自幂数,三位自幂数,四位自幂数等等。



所以鉴于水仙花数的定义的不确定和模糊性

以下代码示例不仅限于三位数的水仙花数,主要涉及的是思想问题。

类名:JavaNarcissus

构造函数:JavaNarcissus()

判断一个数是否为水仙花数:IsNarcissus()---通过键盘输入,对输入的数据进行分析

判断一个数是否为水仙花数:IsNarcissus(int value)---通过参数传递

列举100-999中的所有水仙花数:enumNarcissus()---注意这边和以上对的都是三位数

列举1-1000中的所有水仙花数(这个说法可能是错误的,但是重要的是思想):enumAllNarcissus()---我使用了两种方法,其实还有一种可以用字符串,就不多写了。

主函数:main()


package JavaTestSelf;

import java.util.Scanner;

//判断一个三位数是水仙花数
//找出1000以内的所有水仙花数
//153?=1^3+5^3+3^3 3次方的3是这个数的位数
public class JavaNarcissus {
	
	//构造函数
	JavaNarcissus()
	{
		System.out.println("请输入一个三位数:");
	}
	
	//判断一个三位数是否为水仙花数,通过键盘输入
	public void IsNarcissus()
	{
		Scanner scan = new Scanner(System.in);
		int temp = scan.nextInt();		
		if(temp<100||temp>999)
		{
			System.out.println("你输入的不是三位数,请重新输入!");
		}
		else
		{
			int first = temp/100;
			int middle = (temp%100)/10;
			int last = temp%10;
			double result = Math.pow(first, 3)+Math.pow(middle, 3)+Math.pow(last, 3);
			if(result==temp)
			{
				System.out.println(temp + "是水仙花数!");
			}
			else
			{
				System.out.println(temp + "不是水仙花数!");
			}
		}
	}
	
	//判断一个三位数是否为水仙花数,通过参数传递
	public void IsNarcissus(int value)
	{
		if(value<100||value>999)
		{
			System.out.println("你输入的不是三位数,请重新输入!");
		}
		else
		{
			int first = value/100;
			int middle = (value%100)/10;
			int last = value%10;
			double result = Math.pow(first, 3)+Math.pow(middle, 3)+Math.pow(last, 3);
			if(result==value)
			{
				System.out.println(value+ "是水仙花数!");
			}
		}
	}
	
	//列举100-999中所有的水仙花数
	public void enumNarcissus()
	{
		for(int i=100;i<1000;i++)
		{
			IsNarcissus(i);
		}
	}
	
	//列举1-1000中所有的水仙花数
	public void enumAllNarcissus()
	{
//		方法一
//		for(Integer i=1;i<=1000;i++)
//		{
//			double sum = 0;
//			String s = i.toString();
//			int number = s.length();
//			byte[] byteArr = s.getBytes();
//			for(int j=0;j<byteArr.length;j++)
//			{
//				sum += Math.pow((byteArr[j]-48), number);
//			}
//			if(sum == i)
//			{
//				System.out.println(i + "是水仙花数!");
//			}
//		}
		
//		方法二
		for(Integer i=1;i<=1000;i++)
		{
			int sum=0;
			String s = i.toString();
			int number = s.length();
			for(int j=0;j<number;j++)
			{
				int res = (int)(i/(Math.pow(10, j)))%10;
				sum += Math.pow(res, number);				
			}
			if(sum==i)
			{
				System.out.println(sum + "是水仙花数!");
			}			
		}
	}
	
	//main函数
	public static void main(String[] args) {
		JavaNarcissus test = new JavaNarcissus();
		test.IsNarcissus();
		test.enumNarcissus();
		test.enumAllNarcissus();
	}

}