1. 程式人生 > >java程式設計題之水仙花數

java程式設計題之水仙花數

通過面向物件對水仙花的處理—-物件封裝

  • 使用者操作類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); } }