///其实是修改的别人的代码,代码不分家,共享靠大家,留作以后复习参考。
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关键字,也就是给这个方法添加了一个锁,用来保证线程安全。
*/