java编程题之水仙花数

通过面向对象对水仙花的处理----对象封装

  • 用户操作类UserShuiXianHua.java
package com.ucai.question.shuixianhua;
/**
 * 用户操作类,相当于客户端
 * @author F
 *
 */
public class UserShuiXianHua {
	public static void main(String[] args) {
		//创建水仙花具体操作的类对象
		ShuiXianHua shui = new ShuiXianHua();
		//具体实现的类方法
		shui.panduan();
	}
}
  • 水仙花具体操作类ShuiXianHua.java
package com.ucai.question.shuixianhua;

import java.util.Scanner;

import com.ucai.check.RegExpValidatorUtils;

/**
 * 通过面向对象做水仙花的输出
 * 
 * 情况一:当用户选择判断一个数字是不是水仙花数的选项的时候,调用判断水仙花的相应功能
 * 情况二:当用户选择遍历某个范围的水仙花数的选项的时候,调用相应的封装功能
 * 
 * @author F
 *
 */
public final class ShuiXianHua {
	/**
	 * 客户端入口,相当于程序的入口,只有该方法提供给用户
	 * 用户通过选项,执行不同程序操作
	 * 选项:1判断水仙花数,2遍历某区间内水仙花数
	 * 当用户选择1,进入判断用户输入的数字是否是水仙花数
	 * 当用户选择2,进入遍历用户输入的一个区间,打印出该区间类的所有水仙花数
	 */
	@SuppressWarnings("resource")
	public void panduan() {
		System.out.println("选项:\n1:判断水仙花数,\n2:遍历某区间内水仙花数");
		System.out.println("请给出你的选择:");
		Scanner sc = new Scanner(System.in);
		String str = "";
		outer: while (true) {
			str = sc.next();
			if (!RegExpValidatorUtils.IsIntNumber(str) || str.length() > 1) {
				System.out.println("没有选项" + str + ",请重新选择!");
				continue;
			}
			switch (str) {
				case "1":
					if (!shuixianhua()) {
						break outer;
					}
					break;
				case "2":
					if (!shuixianhuas()) {
						break outer;
					}
					break;
			}
		}
	}
	/**
	 * 根据输入的数字判断是否是水仙花数
	 * 
	 * @return
	 */
	@SuppressWarnings("resource")
	private boolean shuixianhua() {
		Scanner sc = new Scanner(System.in);
		String str = "";
		System.out.println("请输入需要判断是否为水仙花数的数字:\n退出程序:exit\n返回上一层:return\n\n客户输入需要判断的数字:");
		while (true) {
			str = sc.next();
			if ("exit".equals(str.trim())) {
				System.out.println("退出程序成功!");
				return false;
			}
			if ("return".equals(str.trim())) {
				System.out.println("返回上一层!");
				panduan();
			}
			if (!RegExpValidatorUtils.IsIntNumber(str) && !"exit".equals(str.trim())) {
				System.out.println("请输入一个一位或多位的数字!");
				continue;
			}
			checkShuixianhua(str);
		}
	}
	/**
	 * 检测输入的数字是否是水仙花数
	 * @param str
	 */
	private void checkShuixianhua(String str){
		StringBuilder sbsum = new StringBuilder();
		long sum = 0;
		for (int i = 0; i < str.length(); i++) {
			double k = Double.parseDouble(String.valueOf(str.charAt(i)));
			sbsum.append(Math.round(k) + "^3 + ");
			sum += Math.pow(k, 3);
		}
		sbsum.delete(sbsum.lastIndexOf("+"), sbsum.length());
		StringBuilder sb = new StringBuilder(str);
		if (Double.parseDouble(str) == sum) {
			sb.append(" = ").append(sbsum).append(",因此, ").append(str);
			sb.append("是");
		} else {
			sb.append(" != ").append(sbsum).append(",因此, ").append(str);
			sb.append("不是");
		}
		sb.append("水仙花数");
		System.out.println(sb);
	}
	/**
	 * 根据用户输入的范围,遍历出所有的水仙花数
	 * 
	 * @return
	 */
	@SuppressWarnings("resource")
	private boolean shuixianhuas() {
		Scanner sc = new Scanner(System.in);
		String str = "";
		System.out.println("请输入需要查找水仙花数的区间(输入区间格式:1~1000):\n退出程序:exit\n返回上一层:return\n\n客户需要查询的区间:");
		while(true){
			str = sc.next();
			if ("exit".equals(str.trim())) {
				System.out.println("退出程序成功!");
				return false;
			}
			if ("return".equals(str.trim())) {
				System.out.println("返回上一层!");
				panduan();
			}
			if(!checkFormat(str)){
				System.out.println("请按照格式输入区间");
				continue;
			}
			String[] strs = str.split("~");
			shuixianhua(Long.parseLong(strs[0]),Long.parseLong(strs[1]));
			continue;
		}
	}
	/**
	 * 遍历在规定区间内的所有水仙花数
	 * @param start
	 * @param end
	 */
	private void shuixianhua(long start,long end){
		System.out.println(start+"~"+end+"之间的所有水仙花数:");
		for(;start

你可能感兴趣的:(算法)