通过面向对象对水仙花的处理----对象封装
- 用户操作类UserShuiXianHua.java
package com.ucai.question.shuixianhua;
/**
* 用户操作类,相当于客户端
* @author F
*
*/
public class UserShuiXianHua {
public static void main(String[] args) {
//创建水仙花具体操作的类对象
ShuiXianHua shui = new ShuiXianHua();
//具体实现的类方法
shui.panduan();
}
}
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);
}
}