原题如下:
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
———————————————————————————————————————————
以下为我的解题思路:
首先,根据题目得知,我们输入的是数字0到9,输出的却要求用字母a到j,因此,我们采用java的散列表来存储每位数字的转换,键为数字0到9,值为字母a到j,对于单位,我们做相同的处理,用计数变量累计10的1到8次方中的指数部分(2到9位才有单位),将其作为单位散列表的键,值则为SBQWSBQY(十万、百万、千万、也是S、B、Q,且单位之间插入数字,单位是分离开的)
其次,按照一般的分离整数各位数字的方法,是从右到左的,而我们输出却要求从左到右,因此,我们采用堆栈结构来保存输出的内容,将每位数字以及单位分离后存入栈中
最后,我们还要解决的问题是“零”的用法要符合中文习惯的要求,零在整数中的位置有末尾和中间之分,在末尾的时候我们一般不将零念出来,在中间是如果隔着多个单位都是0,那么也只念1个0,且不念0的那一位的单位,而在中间时,还有一种特殊情况就是“千”以上的位数,如果连续多个0(如10003000),那么零也是不需要念的,但单位“万”依旧需要念(如10003000念作:一千万三千,而不是一千万零三千或一千零三千(不念万));
具体实现以上功能的代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
HashMap<Integer, String> 面值 = new HashMap<Integer, String>();
面值.put(0, "a");
面值.put(1, "b");
面值.put(2, "c");
面值.put(3, "d");
面值.put(4, "e");
面值.put(5, "f");
面值.put(6, "g");
面值.put(7, "h");
面值.put(8, "i");
面值.put(9, "j");
HashMap<Integer, String> 单位 = new HashMap<Integer, String>();
单位.put(1, "S");
单位.put(2, "B");
单位.put(3, "Q");
单位.put(4, "W");
单位.put(5, "S");
单位.put(6, "B");
单位.put(7, "Q");
单位.put(8, "Y");
Scanner input = new Scanner(System.in);
int 币值 = input.nextInt(), 计数 = 0, i = 0, flag = 0;
Stack<String> output = new Stack<String>();
if (币值 == 0) {
System.out.print(面值.get(币值));
}
while(币值>0){
i=币值%10;
if(计数>0&&i!=0){
output.push(单位.get(计数));
}//单位输出条件:面值部分不为0
if(计数==0&&i==0){
while(币值%10==0){
币值/=10;
计数++;
if(计数==4&&币值%10==0){
output.push(单位.get(计数));//十,百,千,万单位也为0的情况下才自动输出万
}
}
continue;
//已经到达末尾非0状态,无需++,接下来直接下一轮循环
} else if(计数==4&&i==0){//万以下不为0,万以上又有000结尾
while(币值%10==0){
if(计数==4&&币值%10==0){
output.push(单位.get(计数));//十,百,千有不为0,但万单位为0的情况下自动输出万
}
币值/=10;
计数++;
}
continue;
}else{
if(计数==0)//debug3计数为0时堆栈为空,直接输入面值内容
output.push(面值.get(i));
else if(output.peek()=="a"){
//debug3若顶部为0,则继续下一个单位
}else {
output.push(面值.get(i));
}
}
计数++;
币值/=10;
}
while(output.isEmpty()==false){
System.out.print(output.pop());
}
}
}
PTA打分如下:
总结:
中文习惯中的千万是连在一起作为一个单位的,但是具体输出的时候,千万表示的是千个万,因此,万是类似于个位的默认存在的一个基础单位,个位不需要输出,但是万必须要输出