最近参加校招笔试,又遇到这类题目,每次都考虑不全情况,网上查类似的,好多不全或是大写什么的,自己试着写了一下
java实现的,5位数以内的,目前除了0不行,还没发现其他bug
思路没想太多,应该有更好的,利用栈,逆序来判断数字,再添加多种情况(主要就是零的问题)
10要输出“十” 10->十
数字结尾多个零的省略 100->一百
中间连续几个零只输出一个零 1001->一千零一
正常情况 12345->一万二千三百四十五
import java.util.Scanner;
import java.util.Stack;
public class Change_num {
public static String a(int i)//输出位
{
if(i==0)
return "";
else if(i==1)
return "十";
else if(i==2)
return "百";
else if(i==3)
return "千";
else
return "万";
}
public static String b(int j)//输出数字
{
switch (j) {
case 0:return"零";
case 1:return"一";
case 2:return"二";
case 3:return"三";
case 4:return"四";
case 5:return"五";
case 6:return"六";
case 7:return"七";
case 8:return"八";
default:return "九";
}
}
public static void main(String[] args)
{
Stack<Integer> s1 = new Stack<Integer>();
Stack<Integer> s2 = new Stack<Integer>();
Stack<String> nstr = new Stack<String>();//存放中文数字的栈
System.out.println("请输入一个五位以内的数字:");//输入五位数
Scanner in=new Scanner(System.in);
int num=in.nextInt();
in.close();
while(num!=0)//逆序放入第一个栈 4,3,2,1
{
s1.push(num%10);
num=num/10;
}
while(s1.size()!=0)//正序放入第2个栈 1,2,3,4
{
s2.push((s1.pop()));
}
int x=s2.size();//记录栈长度
//相当于逆序出栈,判断
while(s2.size()!=0)
{
int tab=s2.pop();
if(x==2&&s2.size()>=1&&s2.peek()==1)//特殊情况,10的
{
nstr.push("十");
break;
}
else if(tab!=0&&s2.size()>1&&s2.peek()==0)//要输出零的情况,逆序时只有当前一位不为零,下一位为零才出现零
{
nstr.push(a(x-1-s2.size()));
nstr.push(b(tab));
nstr.push("零");
}
else if(tab!=0)//一般情况,不用管0的
{
nstr.push(a(x-1-s2.size()));
nstr.push(b(tab));
}
}
while(nstr.size()!=0)//打印
{
System.out.print(nstr.pop());
}
}
}
第一次写这个,留着以后方便看
转载请说明