///其實是修改的別人的代碼,代碼不分家,共享靠大家,留作以後複習參考。
import java.util.Scanner;
///題目是 1英鎊=2美元=16人民幣=32港元
///MAX爲最大兌換,意思是所有貨幣都要用到
///MIN爲最小兌換,意思是隻需要港元爲單位即可
///這道題看透了其實就是一道求單位的題,只需要用到除法!!!!!!!!
///輸入: 2 8 2 127 HKD MAX
/// 第一個參數代表英鎊兌美元的匯率,第二個參數代表美元兌人民幣的匯率,第三個參數代表人民幣對港元的匯率
///英鎊>美元>人民幣>港元
///輸出:3 GBP 1 USD 7 CNY 1 HKD
///3*32+1*16+7*2+1 = 127
public class Main
{
public static class SolutionWay
{
private static final String GBP = "GBP";///英鎊
private static final String USD = "USD";///美元
private static final String CNY = "CNY";///人民幣
private static final String HKD = "HKD";///港元
private static final String MAX = "MAX";///最大兌換
private static final String MIN = "MIN";///最小兌換
private static final String ERROR = "ERROR";
private static int gbpRate;
private static int usdRate;
private static int cnyRate;
private static int inputNum;
private static String inputType;
private static String resultType;
///設置匯率係數
private static void setParam(int a, int b, int c, int num, String inputT, String resultT)
{
gbpRate = a * b * c;
usdRate = a * b;
cnyRate = a;
inputNum = num;
inputType = inputT;
resultType = resultT;
}
private static int getRate(String type)
{
switch (type)
{
case GBP:
return gbpRate;
case USD:
return usdRate;
case CNY:
return cnyRate;
default:///港元
return 1;
}
}
private static boolean checkNum(String num)///檢查輸入是否爲負數,或小數
{
for (int i = 0; i < num.length(); i++)
{
char c = num.charAt(i);
if (c < '0' || c > '9')
{
return false;
}
}
return true;
}
private static boolean checkType(String type)///檢查貨幣類型是否爲以下四種之一,主要是檢查是否爲大寫
{
return type.equals(HKD) || type.equals(CNY) || type.equals(USD) || type.equals(GBP);
}
///輸入的所有參數都要進行檢查
private static boolean checkResultType(String resultType)///檢查是否爲MAX或MIN
{
return resultType.equals(MAX) || resultType.equals(MIN);
}
private static String getMaxResult()
{
int tempV = getRate(inputType) * inputNum;///貨幣轉換成以港元爲單位
StringBuilder result = new StringBuilder();
if (tempV / gbpRate > 0)
{
result.append(tempV / gbpRate).append(' ').append("GBP ");
tempV = tempV % getRate(GBP);
}
if (tempV / usdRate > 0)
{
result.append(tempV / usdRate).append(' ').append("USD ");
tempV = tempV % getRate(USD);
}
if (tempV / cnyRate > 0)
{
result.append(tempV / cnyRate).append(' ').append("CNY ");
tempV = tempV % getRate(CNY);
}
if (tempV > 0)
{
result.append(tempV).append(' ').append("HKD");
}
return result.toString();
}
private static String getMinResult()
{
return inputNum * getRate(inputType) + " HKD";
}
private static String computer(String input)
{
String[] strArr = input.split("\\s");///以空白字符分割字符串,得到一個字符串數組。
/*
1、\s用於匹配空白字符。
2、\\s用於匹配字符串中的\和s,兩個字符。
*/
if (strArr.length == 6 && (checkNum(strArr[0]) && checkNum(strArr[1]) && checkNum(strArr[2]) && checkNum(strArr[3]) && checkType(strArr[4]) && checkResultType(strArr[5])))
{
setParam(Integer.parseInt(strArr[0]), Integer.parseInt(strArr[1]), Integer.parseInt(strArr[2]), Integer.parseInt(strArr[3]), strArr[4], strArr[5]);
if (resultType.equals(MAX))
{
return getMaxResult();///最大兌換
} else
{
return getMinResult();
}
} else
{
return ERROR;
}
}
}
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
String s1 = in.nextLine();
System.out.println(SolutionWay.computer(s1));
}
}
/*
一些基礎總結
1、 String類是不可變類,即一旦一個String對象被創建以後,包含在這個對象中的字符序列是不可改變的,直至這個對象被銷燬。
2、 StringBuffer對象則代表一個字符序列可變的字符串,當一個StringBuffer被創建以後,通過
StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()
等方法可以改變這個字符串對象的字符序列。一旦通過StringBuffer生成了最終想要的字符串,
就可以調用它的toString()方法將其轉換爲一個String對象。
3、StringBuilder類也代表可變字符串對象。實際上,StringBuilder和StringBuffer基本相似,
兩個類的構造器和方法也基本相同。不同的是:StringBuffer是線程安全的,而StringBuilder則沒有實現線程安全功能,所以性能略高。
StringBuffer類中的方法都添加了synchronized關鍵字,也就是給這個方法添加了一個鎖,用來保證線程安全。
*/