java程式設計題之水仙花數
阿新 • • 發佈:2019-01-29
通過面向物件對水仙花的處理—-物件封裝
- 使用者操作類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);
}
}