VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: daike1017

一道java笔试题,以为很简单,结果半天都没写对!请大虾给出个正确解答

  [复制链接]

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-19 22:00:01 | 显示全部楼层
public class test {
        public static void main(String[] arg) throws IOException {
                String d="拾佰仟万拾佰仟亿拾佰仟万";
                String s="零壹贰叁肆伍陆柒捌玖";
                boolean zero=false;
                int value=1101111001, count=0;
                String Cvalue="";
                while(value>0) {
                        int b=value-value/10*10;
                        if(!zero || b!=0) {
                                String t="";
                                if(b!=0) {
                                        t=s.substring(b,b+1);
                                        if(count>0) t+=d.substring(count-1,count);
                                        zero=false;
                                }
                                else {
                                        t="零";
                                        zero=true;
                                }
                                Cvalue=t+Cvalue;
                        }
                        count++;
                        value/=10;
                }
               
                System.out.println(Cvalue);
        }
}
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-20 00:00:01 | 显示全部楼层
还有些问题,修正一下:
public class test {
        public static void main(String[] arg) throws IOException {
                String d="拾佰仟万拾佰仟亿拾佰仟万";
                String s="零壹贰叁肆伍陆柒捌玖";
                boolean zero=false;
                int value=2021000789, count=0;
                String Cvalue="";
                while(value>0) {
                        int b=value-value/10*10;
                        if(!zero || b!=0) {
                                String t="";
                                if(b!=0) {
                                        t=s.substring(b,b+1);
                                        if(count>0) t+=d.substring(count-1,count);
                                        zero=false;
                                }
                                else if(count!=4 && count!=8){
                                        t="零";
                                        zero=true;
                                }
                                Cvalue=t+Cvalue;
                        }
                        if(count==4 && !Cvalue.contains("万")) Cvalue="万"+Cvalue;
                        if(count==8 && !Cvalue.contains("亿")) Cvalue="亿"+Cvalue;
                        count++;
                        value/=10;
                }
                System.out.println(Cvalue);
        }
}
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-20 15:15:01 | 显示全部楼层
搞了一下,
试验下,效果不错的.
----------------------------------------------
package com;

import java.io.*;

/**
* @author cct
*/
public class a
{
        public static void main(String[] args)
        {
                String s = new String();
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

                while (true)
                {
                        try
                        {
                                System.out.println("请输入数字:并回车");
                                s = br.readLine();

                                Convert c = new Convert(s.toCharArray());
                                System.out.println(c);
                        }
                        catch (Exception e)
                        {
                        }
                }
        }
}

/**
* @author cct
*/
class Convert
{
        final String[] str1 = { "", "拾", "百", "千" };

        final String[] str2 = { "亿", "萬" };

        final String[] number = { "", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

        char[] num_char;

        StringBuffer sb = new StringBuffer();

        int last;

        public Convert(char[] num)
        {
                num_char = num;
        }

        public String toString()
        {
                last = num_char.length % 4;
                int pos = 0;
                add(sb, new String(num_char, 0, last));
                pos += last;
                for (int i = (int) (num_char.length / 4); i > 0; i--)
                {
                        if (i % 2 == 0)
                                sb.append(str2[0]);
                        else
                                sb.append(str2[1]);
                        add(sb, new String(num_char, pos, 4));
                        pos += 4;
                }
                if (last == 0)
                        sb.deleteCharAt(0);
                return sb.toString();
        }

        /**
         * @param sb
         * @param temp
         */
        private void add(StringBuffer sb, String temp)
        {
                char[] temp2 = temp.toCharArray();
                int length = temp.length();
                for (int i = 0; i < length; i++)
                {
                        if (temp2[i] == '0')
                                if (sb.lastIndexOf("零") != sb.length() - 1 && last != 0)
                                        sb.append("零");
                                else
                                        ;
                        else
                        {
                                sb.append(number[temp2[i] - '0']);
                                sb.append(str1[length - i - 1]);
                        }
                }
                try
                {
                        if (sb.lastIndexOf("零") == sb.length() - 1)
                                sb.deleteCharAt(sb.lastIndexOf("零"));
                }
                catch (Exception e)
                {
                }
        }
}
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-20 16:30:01 | 显示全部楼层
中午没事做了一下,这样应该没有什么问题了吧,如果有请提出,大家共勉
import java.io.*;
import java.util.*;
/**
   将输入的数字用中文表示出来
*/

public class NumberTest
{
        private char ch;
        private String[] charOfNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        private String[] shibq = {"","拾","佰","仟"};
        private String[] wany = {"个","萬","亿","萬","亿","萬","亿"};

        String inputStringNum()
        //从键盘输入有效数字
        {   
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String string = null;
            try
            {
               string = reader.readLine();
            }catch(IOException ex)
            {
                    System.err.println(ex.getMessage());
            }
            return stringReverse(disinfectZero(string));
        }
       
        private String disinfectZero(String string)
        //将输入数字有效位前面的零清除
        {
                int length = string.length();
                int i = 0;
                String stringReturn = string;
                if(Long.parseLong(string) == 0L)
                {
                        stringReturn = "0";
                }
                else
                {
                        while(string.charAt(i++) == '0')
                        {
                                stringReturn = string.substring(i,length);
                        }       
                }
                return stringReturn;
        }
       
        private String stringReverse(String string)
        //将输入的数字倒序排列
        {
                int length = string.length();
                String stringReturn = "";
                for(int i = 0;i<length;i++)
                {
                    ch = string.charAt(i);
                    stringReturn = ch+stringReturn;
                }
               
                return stringReturn;
        }       
       
        public String change()
        {  
           String string = inputStringNum();//获取输入数据
           String resultStr;
           String resultString = "";//保存结果
          
           if(Long.parseLong(string) == 0L)
           {
                     resultString = "零";
           }
           else
           {
                     
                   //将数据分为四个一组
                   int length = string.length();
                   int intoffour = length/4;
               if((length%4) != 0)
                   {
                           intoffour+=1;
                   }
                          
                  //将数据分组存放到字符串数组中,再分别转化
                   String stringnum[] = new String[intoffour];
                   for(int i = 0;i<intoffour-1;i++)
                   {
                           stringnum[i] = string.substring(i*4,(i+1)*4);
                   }
                   stringnum[intoffour-1] = string.substring((intoffour-1)*4,length);
                                  
                   //获得完整的表达
                   for(int i = 0;i<intoffour;i++)
                   {  
                           resultStr = "";
                           for(int j = 0;j<stringnum[i].length();j++)
                           {
                                   ch = stringnum[i].charAt(j);
                                   String str = ""+ch;
                                   int charAt = Integer.parseInt(str);
                                   //if(charAt != 0)
                                   //{
                                             resultStr = charOfNum[charAt]+shibq[j]+resultStr;
                                   //}
                           }
                           if(Integer.parseInt(stringnum[i]) != 0)
                           {
                                              resultString = resultStr+wany[i]+resultString;   
                           }
                           else
                           {
                                     resultString = "零"+resultString;
                           }
                   }
           }
           resultString = resultString.replaceAll("零拾", "零");
       resultString = resultString.replaceAll("零佰", "零");
       resultString = resultString.replaceAll("零仟", "零");
           resultString = resultString.replaceAll("[零]+", "零");
           resultString = resultString.replaceAll("零个","");
           resultString = resultString.replaceAll("零萬", "萬");
       resultString = resultString.replaceAll("零亿", "亿");
           return resultString;
        }
       
        public static void main(String[] args) throws Exception
        {
                NumberTest test = new NumberTest();
        System.out.println(test.change());
    }
}
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-20 18:00:02 | 显示全部楼层
super541 楼上两层
你输入0000002 看一下结果是什么?
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-20 19:15:01 | 显示全部楼层
这下更好了
import java.io.*;
import java.util.*;
/**
   将输入的数字用中文表示出来
*/

public class NumberTest
{
        private char ch;
        private String[] charOfNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        private String[] shibq = {"","拾","佰","仟"};
        private String[] wany = {"个","萬","亿","萬","亿","萬","亿"};
        public String exit = null;

        String inputStringNum()
        //从键盘输入有效数字
        {   
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String string = null;
            try
            {
               string = reader.readLine();
            }catch(IOException ex)
            {
                    System.err.println(ex.getMessage());
            }
            if(string.equals("exit"))
            {
                    System.exit(0);
            }
            return stringReverse(disinfectZero(string));
        }
       
        private String disinfectZero(String string)
        //将输入数字有效位前面的零清除
        {
                int length = string.length();
                int i = 0;
                String stringReturn = string;
                if(Long.parseLong(string) == 0L)
                {
                        stringReturn = "0";
                }
                else
                {
                        while(string.charAt(i++) == '0')
                        {
                                stringReturn = string.substring(i,length);
                        }       
                }
                return stringReturn;
        }
       
        private String stringReverse(String string)
        //将输入的数字倒序排列
        {
                int length = string.length();
                String stringReturn = "";
                for(int i = 0;i<length;i++)
                {
                    ch = string.charAt(i);
                    stringReturn = ch+stringReturn;
                }
               
                return stringReturn;
        }       
       
        public String change()
        //将数字转化为文字表达
        {  
           String string = inputStringNum();//获取输入数据
           String resultStr;
           String resultString = "";//保存结果
          
           if(Long.parseLong(string) == 0L)
           {
                     resultString = "零";
           }
           else
           {
                     
                   //将数据分为四个一组
                   int length = string.length();
                   int intoffour = length/4;
               if((length%4) != 0)
                   {
                           intoffour+=1;
                   }
                          
                  //将数据分组存放到字符串数组中,再分别转化
                   String stringnum[] = new String[intoffour];
                   for(int i = 0;i<intoffour-1;i++)
                   {
                           stringnum[i] = string.substring(i*4,(i+1)*4);
                   }
                   stringnum[intoffour-1] = string.substring((intoffour-1)*4,length);
                                  
                   //获得完整的表达
                   for(int i = 0;i<intoffour;i++)
                   {  
                           resultStr = "";
                           for(int j = 0;j<stringnum[i].length();j++)
                           {
                                   ch = stringnum[i].charAt(j);
                                   String str = ""+ch;
                                   int charAt = Integer.parseInt(str);
                                   resultStr = charOfNum[charAt]+shibq[j]+resultStr;
                           }
                           if(Integer.parseInt(stringnum[i]) != 0)
                           {
                                              resultString = resultStr+wany[i]+resultString;   
                           }
                           else
                           {
                                     resultString = "零"+resultString;
                           }
                   }
           }
           resultString = resultString.replaceAll("零拾", "零");
       resultString = resultString.replaceAll("零佰", "零");
       resultString = resultString.replaceAll("零仟", "零");
           resultString = resultString.replaceAll("[零]+", "零");
           resultString = resultString.replaceAll("零个","");
           resultString = resultString.replaceAll("个","");
           resultString = resultString.replaceAll("零萬", "萬");
       resultString = resultString.replaceAll("零亿", "亿");
           return resultString;
        }
       
        public static void main(String[] args) throws Exception
        {
                NumberTest test = new NumberTest();
                System.out.println("请输入数字并回车,若要退出请输入exit");
                while(true)
                {
                        System.out.println(test.change());
                }
        
    }
}
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-20 21:30:01 | 显示全部楼层
利用自动机理论来做。将数分成4位的节(Section).
public class RMBConvert
        {
                public RMBConvert()
                {
                       
                }

                private static string[] faceVal = new String[] { "零", "壹", "贰", "叁", "肆",
                                                                                                                   "伍", "陆", "柒", "捌", "玖" };

                private static string []unit = new string[]{"仟","佰","拾",""};

                private static string[] level = new String[] { "圆", "拾", "佰", "仟", "萬", "亿" };

                public string Convert(string rmb)
                {
                        int len = 0;
                        string ret = "";
                        string tmpY = "";
                        string tmpW = "";
                        string tmpG = "";
                        bool bFlag = false;


                        if(rmb.Length > 8)
                                rmb = rmb.PadLeft(12, '0');
                        else if(rmb.Length > 4)
                                rmb = rmb.PadLeft(8, '0');
                        else rmb = rmb.PadLeft(4, '0');

                        if(rmb.Length > 8)
                        {
                                tmpY = ConvertSection(rmb, 0, 4, false);
                                if(tmpY != "零")
                                {
                                        ret += tmpY + "亿";
                                        bFlag = true;
                                }
                                tmpW = ConvertSection(rmb, 4, 4, bFlag);
                                if(tmpW != "零")
                                {
                                        ret += tmpW + "万";
                                        bFlag = true;
                                }
                                tmpG = ConvertSection(rmb, 8, 4, bFlag);
                                if(tmpG != "零")
                                        ret += tmpG;
                                else{
                                        if(tmpY == "零" && tmpW == "零" && tmpG == "零")
                                                ret = "零";
                                }
                        }
                        else if(rmb.Length > 4)
                        {
                                tmpW = ConvertSection(rmb, 0, 4, false);
                                if(tmpW != "零")
                                {
                                        ret += tmpW + "万";
                                        bFlag = true;
                                }
                                tmpG = ConvertSection(rmb, 4, 4, bFlag);
                                if(tmpG != "零")
                                {
                                        ret += tmpG;
                                }
                                else
                                {
                                        if(tmpW == "零")
                                                ret = "零";
                                }
                        }
                        else{
                                ret = ConvertSection(rmb, 0, 4, false);
                        }
                        return ret;
                }

                public string ConvertSection(string value, int start, int len, bool headerZero)
                {
                        return ConvertSection(value.Substring(start, len), headerZero);
                }

                public string ConvertSection(string value)
                {
                        return ConvertSection(value, false);
                }
                /// <summary>
                /// 主要看这个了
                /// </summary>
                /// <param name="value"></param>
                /// <param name="headerZero"></param>
                /// <returns></returns>
                public string ConvertSection(string value, bool headerZero)
                {
                        string regVal = value.PadLeft(4, '0');
                        string strOutput = "";

                        int state = 0;
                        for(int i=0; i<4;i++)
                        {
                                int crr = regVal[i] - 0x30;
                                switch(state)
                                {
                                        case 0:
                                                if( crr == 0 )
                                                {
                                                        state = 1;
                                                }
                                                else{
                                                        state = 2;
                                                        strOutput += faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 1:
                                                if( crr == 0 )
                                                {
                                                        state = 3;
                                                }
                                                else
                                                {
                                                        state = 5;
                                                        if( headerZero )
                                                                strOutput += "零";
                                                        strOutput +=  faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 2:
                                                if( crr == 0 )
                                                {
                                                        state = 4;
                                                }
                                                else
                                                {
                                                        state = 5;
                                                        strOutput += faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 3:
                                                if( crr == 0 )
                                                {
                                                        state = 11;
                                                }
                                                else
                                                {
                                                        state = 6;
                                                        if( headerZero )
                                                                strOutput += "零";
                                                        strOutput += faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 4:
                                                if( crr == 0 )
                                                {
                                                        state = 7;
                                                }
                                                else
                                                {
                                                        state = 6;
                                                        strOutput += "零" + faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 5:
                                                if( crr == 0 )
                                                {
                                                        state = 7;
                                                }
                                                else
                                                {
                                                        state = 6;
                                                        strOutput += faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 6:
                                                if( crr == 0 )
                                                {
                                                        state = 8;
                                                }
                                                else
                                                {
                                                        state = 9;
                                                        strOutput += faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 7:
                                                if( crr == 0 )
                                                {
                                                        state = 10;
                                                }
                                                else
                                                {
                                                        state = 9;
                                                        strOutput += "零" + faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 11:
                                                if( crr == 0 )
                                                {
                                                        state = 12;
                                                        strOutput = "零";
                                                }
                                                else
                                                {
                                                        state = 13;
                                                        if( headerZero )
                                                                strOutput += "零";
                                                        strOutput += faceVal[crr] + unit[i];
                                                }
                                                break;
                                        case 8:break;
                                        case 9:break;
                                        case 10:break;
                                        case 12:break;
                                        case 13:break;
                                } // end of switch
                        } // end of for
                        return strOutput;
                }
        }
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-20 22:30:01 | 显示全部楼层
第一次见贴了这么多代码,不想看,为什么不说说解题思路?用什么方法?我觉得这样比看各种版本的代码好得多
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-20 23:00:01 | 显示全部楼层
我们看到一串数字是怎么读的呢?是什么规则呢?
1。忽略前导零
2。从非零最高位读起,数字加上称谓,遇零忽略
   如5变成“伍”,再根据位置如第3位则对应“佰”,加一起就是“伍佰”

没考虑太多,不对的地方楼下修改
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-21 12:00:01 | 显示全部楼层
package test;

public class Money {
        private static String[] UNIT = { "圆", "拾", "佰", "仟", "万", "拾", "佰", "仟",
                        "亿", "拾", "佰", "仟" };

        private static String[] CHINESE_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍",
                        "陆", "柒", "捌", "玖" };

        private static String NUMBER = "0123456789";

        public static void main(String[] args) {
                long amount = 100000006543L;
                String result = formatMoney(amount);
                System.out.print(result);
        }

        public static String formatMoney(long amount) {
                String money = Long.toString(amount);
                String result = "";
                char letter;
                boolean hasZero = false;
                final int count = money.length();
                for (int i = 0; i < count; i++) {
                        letter = money.charAt(i);
                        if (letter == '0') {
                                hasZero = true;
                                if (count - 1 - i == 0) {
                                        result += "圆";
                                }
                                if (count - 1 - i == 4 && !result.endsWith("亿")) {
                                        result += "万";
                                        hasZero = false;
                                }
                                if (count - 1 - i == 8) {
                                        result += "亿";
                                        hasZero = false;
                                }
                        } else {
                                if (hasZero) {
                                        result += "零" + CHINESE_NUMBER[NUMBER.indexOf(letter)]
                                                        + UNIT[count - 1 - i];
                                } else {
                                        result += CHINESE_NUMBER[NUMBER.indexOf(letter)]
                                                        + UNIT[count - 1 - i];
                                }
                                hasZero = false;
                        }
                }
                return result;
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表