java编程题之水仙花数

来源:互联网 发布:通往天堂的钥匙淘宝网 编辑:程序博客网 时间:2024/05/18 16:38

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

  • 用户操作类UserShuiXianHua.java
package com.ucai.question.shuixianhua;/** * 用户操作类,相当于客户端 * @author facebook * */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 facebook * */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);    }}
原创粉丝点击