通过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<end;start++){
			String st = shuixianhua(String.valueOf(start));
			if(st!=null){
				System.out.print(st+"  ");
			}
			else{
				System.out.println("抱歉,该区间内没有水仙花数!");
				break;
			}
		}
	}
	/**
	 * 经过判断传入的数字是否为水仙花数,
	 * 如果是,则返回这个数,如果不是,则返回null
	 * @param str
	 * @return
	 */
	private String shuixianhua(String str){
		long strInt = Long.parseLong(str);
		long sum=0;
		for(int i=0;i<str.length();i++){
			double k = Double.parseDouble(String.valueOf(str.charAt(i)));
			sum+=Math.round(Math.pow(k, 3));
		}
		if(strInt==sum){
			return str;
		}
		return null;
	}
	/**
	 * 匹配输入的水仙花区间的格式
	 * 1~1000
	 * @param str
	 * @return
	 */
	private static boolean checkFormat(String str) {
		String regex = "^(\\d+~)(\\d+)$";
		return str.matches(regex);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值