VerySource

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

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

  [复制链接]

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-4-24 09:45:01 | 显示全部楼层
C:\Documents and Settings\Administrator\桌面>java a
120100101
壹亿贰千零壹十萬壹百零壹
1

223
贰百贰十叁
102
壹百零贰
1000
壹千
1263
壹千贰百陆十叁
123021
壹十贰萬叁千零贰十壹
100001
壹十萬零壹
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-4-25 15:30:01 | 显示全部楼层
网上有标准算法的
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-4-25 18:30:02 | 显示全部楼层
我发现我那个有点小错误,这样就对了
import java.io.*;


public class a
{
   public static void main(String[] args)
   {
     String s=new String();
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     
     while(true)
     {
        try{s=br.readLine();}catch(Exception e){}
       Convert c = new Convert(s.toCharArray());
       System.out.println(c);
     }
   }
}
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();
  }
  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){}
  }
}

结果是这样的:
120100101
壹亿贰千零壹十萬零壹百零壹
20100101
贰千壹十萬壹百壹
1234567894564513213
壹百贰十叁亿肆千伍百陆十柒萬捌千玖百肆十伍亿陆千肆百伍十壹萬叁千贰百壹十叁
121202013210301005401650540321013
壹亿贰千壹百贰十萬贰千零壹十叁亿贰千壹百零叁萬零壹百亿伍千肆百零壹萬陆千伍百零伍
亿肆千零叁十贰萬壹千零壹十叁
2121254548545
贰萬壹千贰百壹十贰亿伍千肆百伍十肆萬捌千伍百肆十伍
1

123
壹百贰十叁
100
壹百
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-4-25 19:45:01 | 显示全部楼层
还是有一个小错误,算了,我不改了,呵呵.
回复

使用道具 举报

2

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-5-5 16:15:01 | 显示全部楼层
我来验证一下
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-5-9 09:15:01 | 显示全部楼层
自认为无懈可击,愿高人测试。
受到nanase的启发,谨表示谢意,愿与大家共享思路。

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

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

        public static void main(String[] arg) {
                StringBuffer sb = new StringBuffer();
                try {
                        BufferedReader in = new BufferedReader(new InputStreamReader(
                                        System.in));
                        String s1 = in.readLine();
                        for (int i = 0; i < s1.length(); i++) {
                                int digit = Integer.valueOf(s1.substring(i, i + 1)).intValue();
                                sb.append(faceVal[digit]);
                        }
                        String face = sb.reverse().toString();
                        StringBuffer resultSb = new StringBuffer();
                        for (int i = 0; i < face.length(); i++) {
                                //加权
                                if (i == 0) {                                                               
                                        resultSb.append(level[0]);                                       
                                }
                                else{
                                        //万位处理
                                        if ((i + 4) % 8 == 0) {                                               
                                                resultSb.append(level[4]);                                       
                                        }
                                        //亿位处理
                                        else if (i % 8 == 0) {                                               
                                                resultSb.append(level[5]);                                               
                                        }
                                        else {                                       
                                                resultSb.append(level[i % 4]);
                                        }
                                }
                                //加面值
                                String temp = face.substring(i, i + 1);
                                resultSb.append(temp);
                        }

                        String result = resultSb.reverse().toString();
                       
                               
                        result = result.replaceAll("零拾", "零");
                        result = result.replaceAll("零佰", "零");
                        result = result.replaceAll("零仟", "零");
                       
                        result = result.replaceAll("[零]+", "零");
                       
                        result = result.replaceAll("零圆", "圆");                       
                        result = result.replaceAll("零萬", "萬");
                        result = result.replaceAll("零亿", "亿");   
                       
                        System.out.println(result + "整");
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-5-11 20:15:02 | 显示全部楼层
public class Test {
        /**
         * description 根据人民币的数字转化成中文的大写形式
         *
         * @param String
         *            type 人民币数字
         * @return String 大写形式的字符串
         * @author date: 2002-10-20
         */
        public String getChineseMoney(String moneyNum) {
                // 存放汉字的数组
                String[] chinese = new String[17];
                String[] money = new String[2];
                chinese[0] = "零";
                chinese[1] = "壹";
                chinese[2] = "贰";
                chinese[3] = "叁";
                chinese[4] = "肆";
                chinese[5] = "伍";
                chinese[6] = "陆";
                chinese[7] = "柒";
                chinese[8] = "捌";
                chinese[9] = "玖";
                chinese[10] = "拾";
                chinese[11] = "佰";
                chinese[12] = "仟";
                chinese[13] = "万";
                chinese[14] = "亿";
                chinese[15] = "元";
                chinese[16] = "整";
                money[0] = "角";
                money[1] = "分";
                // 输出的大写形式字符串
                String str_out = "";
                // 整数部分字符串
                String str_left = "";
                // 小数部分字符串
                String str_right = "";
                // 小数点
                String str_point = ".";
                // 小数点位置
                int ponitLocation = moneyNum.indexOf(".");

                // 小数点后位数
                int pointLater = 0;
                if (ponitLocation != -1) {
                        pointLater = moneyNum.length() - ponitLocation - 1;
                } else {
                        pointLater = moneyNum.length();
                }

                // 分离字符串为两部分
                if (pointLater > 1) {
                        if (ponitLocation != -1) {
                                str_left = moneyNum.substring(0, ponitLocation);
                                str_right = moneyNum.substring(ponitLocation + 1,
                                                ponitLocation + 3);
                        } else {
                                str_left = moneyNum;
                        }

                }
                // 整数部分字符串的长度
                int str_left_length;
                str_left_length = str_left.length();
                // 小数部分字符串的长度
                int str_right_length;
                str_right_length = str_right.length();
                // 整数部分的零字符标识位
                int flag = 0;
                // 小数部分的零字符标识位
                int flag_zreo = 0;
                // 开始转换整数部分
                for (int i = 0; i <= str_left.length() - 1; i++) {

                        String str_l;
                        str_l = str_left.substring(i, i + 1);
                        int temp = Integer.parseInt(str_l);
                        switch (temp) {
                        case 1:
                                str_out = str_out + chinese[1];
                                break;
                        case 2:
                                str_out = str_out + chinese[2];
                                break;
                        case 3:
                                str_out = str_out + chinese[3];
                                break;
                        case 4:
                                str_out = str_out + chinese[4];
                                break;
                        case 5:
                                str_out = str_out + chinese[5];
                                break;
                        case 6:
                                str_out = str_out + chinese[6];
                                break;
                        case 7:
                                str_out = str_out + chinese[7];
                                break;
                        case 8:
                                str_out = str_out + chinese[8];
                                break;
                        case 9:
                                str_out = str_out + chinese[9];
                                break;
                        }
                        // 对整数部分的零的处理
                        if (temp == 0) {
                                flag++;
                                if (str_left_length == 1) {
                                        str_out = str_out + chinese[15];
                                }
                                if (str_left_length == 9) {
                                        flag = 0;
                                        str_out = str_out + chinese[14];
                                }
                                if (str_left_length == 5) {
                                        flag = 0;
                                        str_out = str_out + chinese[13];
                                }
                                // 判断是否输出零,根据它的下一位来决定:是零则不输出,否则输出
                                if (str_left_length >= 2) {
                                        String str_le = str_left.substring(i + 1, i + 2);
                                        int tem = Integer.parseInt(str_le);
                                        if ((flag == 1) && (tem != 0)) {
                                                str_out = str_out + chinese[0];
                                        } else {
                                                flag = 0;
                                        }
                                }
                                str_left_length--;
                                // System.out.println(str_left_length--);
                        } else {
                                flag = 0;
                                // 添加整数部分的单位:拾, 佰,仟 ,万,亿
                                switch (str_left_length) {

                                case 1:
                                        str_out = str_out + chinese[15];
                                        str_left_length--;
                                        break;
                                case 2:
                                        str_out = str_out + chinese[10];
                                        str_left_length--;
                                        break;
                                case 3:
                                        str_out = str_out + chinese[11];
                                        str_left_length--;
                                        break;
                                case 4:
                                        str_out = str_out + chinese[12];
                                        str_left_length--;
                                        break;
                                case 5:
                                        str_out = str_out + chinese[13];
                                        str_left_length--;
                                        break;
                                case 6:
                                        str_out = str_out + chinese[10];
                                        str_left_length--;
                                        break;
                                case 7:
                                        str_out = str_out + chinese[11];
                                        str_left_length--;
                                        break;
                                case 8:
                                        str_out = str_out + chinese[12];
                                        str_left_length--;
                                        break;
                                case 9:
                                        str_out = str_out + chinese[14];
                                        str_left_length--;
                                        break;
                                case 10:
                                        str_out = str_out + chinese[10];
                                        str_left_length--;
                                        break;
                                case 11:
                                        str_out = str_out + chinese[11];
                                        str_left_length--;
                                        break;
                                case 12:
                                        str_out = str_out + chinese[12];
                                        str_left_length--;
                                        break;
                                case 13:
                                        str_out = str_out + chinese[13];
                                        str_left_length--;
                                        break;
                                }

                        }
                }
                // 处理小数部分的字符串
                for (int i = 0; i <= str_right.length() - 1; i++) {
                        String str_r;
                        str_r = str_right.substring(i, i + 1);
                        int temp1 = Integer.parseInt(str_r);
                        switch (temp1) {
                        case 1:
                                str_out = str_out + chinese[1];
                                break;
                        case 2:
                                str_out = str_out + chinese[2];
                                break;
                        case 3:
                                str_out = str_out + chinese[3];
                                break;
                        case 4:
                                str_out = str_out + chinese[4];
                                break;
                        case 5:
                                str_out = str_out + chinese[5];
                                break;
                        case 6:
                                str_out = str_out + chinese[6];
                                break;
                        case 7:
                                str_out = str_out + chinese[7];
                                break;
                        case 8:
                                str_out = str_out + chinese[8];
                                break;
                        case 9:
                                str_out = str_out + chinese[9];
                                break;

                        }
                        // 对小数部分的零的处理
                        if (temp1 == 0) {
                                flag_zreo++;
                                if (str_right_length == 2) {
                                        // 判断是否输出零,根据它的下一位来决定:是零则不输出,否则输出
                                        String str_ri = str_right.substring(i + 1, i + 2);
                                        int temp = Integer.parseInt(str_ri);
                                        if ((flag_zreo == 1) && (temp != 0)) {
                                                str_out = str_out + chinese[0];
                                        }
                                } else {
                                        str_out = str_out + chinese[16];
                                }
                                str_right_length--;
                        } else {
                                // 添加小数部分的角、分
                                switch (str_right_length) {
                                case 1:
                                        str_out = str_out + money[1];
                                        str_right_length--;
                                        break;
                                case 2:
                                        str_out = str_out + money[0];
                                        str_right_length--;
                                        break;
                                }
                        }
                }
                return str_out;
        }

        public static void main(String[] a) {
                Test test = new Test();
                System.out.println(test.getChineseMoney("1050"));

        }

}
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-5-18 19:15:01 | 显示全部楼层
我这个也是无懈可击了.我认为.

import java.io.*;
public class a
{
   public static void main(String[] args)
   {
     String s=new String();
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

     while(true)
     {
        try{s=br.readLine();}catch(Exception e){}
       Convert c = new Convert(s.toCharArray());
       System.out.println(c);
     }
   }
}
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();
  }
  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 && sb.length()!=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){}
  }
}

运行结果为:
1

10
壹十
100
壹百
1000
壹千
10000
壹萬
10000000
壹千萬
102351225
壹亿零贰百叁十伍萬壹千贰百贰十伍
10250250210210
壹十萬贰千伍百零贰亿伍千零贰十壹萬零贰百壹十
32135400213501232450123256903284230040
叁十贰萬壹千叁百伍十肆亿零贰十壹萬叁千伍百零壹亿贰千叁百贰十肆萬伍千零壹十贰亿叁
千贰百伍十陆萬玖千零叁十贰亿捌千肆百贰十叁萬零肆十

回复

使用道具 举报

1

主题

21

帖子

19.00

积分

新手上路

Rank: 1

积分
19.00
发表于 2020-5-20 13:30:01 | 显示全部楼层
你们彪悍的阿

写这么多不怕时间不够用吗,纸头不够写吗。


        static String t1 = "零壹贰叁肆伍陆柒捌玖";

        static char[] n = { '仟', ' ', '拾', '佰' };

        static char[] n1 = {'萬','亿'};

        static char end = '圆';       


public static void print(String value, int pos, boolean b) {
                if (pos == 0) {
                        System.out.print(end);
                        return;
                }
                String value2 = value.substring(1, value.length());
                int printPos = value.charAt(0) - '0';
                if (printPos != 0) {
                        if (b == true)
                                System.out.print(t1.charAt(0));
                        System.out.print(t1.charAt(printPos));
                        System.out.print(printPos == 0 ? "" : (n[pos % 4] == ' ' ? "": n[pos % 4]));
                }
                if (pos % 4 == 1 && pos > 1) {
                        System.out.print(n1[(pos / 4) - 1]);
                        print(value2, pos - 1,  false);
                        return;
                }
                print(value2, pos - 1, printPos == 0 ? true : false);
        }

使用方法
print("10010202070", 11, false);
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-5-24 00:00:01 | 显示全部楼层
我去笔试时也遇到这题,开始以为很简单,但过后才发现困难重重,主要是在0的处理上。回家后整整用了几个钟的时间才写出正确的程序(笔试时只有一个钟时间!):


#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#define MAX 0xffff
void main()
{
        char *temp1[] = {"","十","百","千"};
        char *temp2[] = {"零","一","二","三","四","五","六","七","八","九"};
        enum {N,SHI,BAI,QIAN,WAN,YI};
        char input[MAX];
        char cache[MAX];
        char cache1[MAX];
        bool zero=false;
        int leng,i,prevMax;
        cin>>input;
        leng = strlen(input)-1;
        for(i=0;i<MAX && i<=leng;i++)
        {
                cache[i]=input[i];
                if((leng-i)%4)
                        cache1[i]=(leng-i)%4;
                else if(leng-i>4 && !((leng-i)%8))
                        cache1[i]=YI;
                else if(leng-i!=0)
                        cache1[i]=WAN;
                else
                        cache1[i]=N;
        }
        cache[i]=cache1[i]=0;

        for(i=0;cache[i]=='0';i++);
        while(1)
        {
                if(cache[i]!='0')
                {
                        prevMax=cache1[i];
                        if(cache[i]==0)
                                break;
                        if(zero==true)
                                cout<<temp2[0];
                        cout<<temp2[cache[i]-0x30];
                        if(cache1[i]<4)
                                cout<<temp1[cache1[i]];
                        else if(cache1[i]==WAN)
                                cout<<"万";
                        else if(cache1[i]==YI)
                                cout<<"亿";
                        zero=false;
                }
                else
                {
                        zero=true;
                        if(cache1[i]>prevMax || cache1[i]==YI)
                        {
                                prevMax=cache1[i];
                                if(cache1[i]<4)
                                        cout<<temp1[cache1[i]];
                                else if(cache1[i]==4)
                                        cout<<"万";
                                else
                                        cout<<"亿";
                        }
                }
                i++;
        }
        cout<<endl;
}
回复

使用道具 举报

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

本版积分规则

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

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