VerySource

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

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

  [复制链接]

0

主题

1

帖子

472.00

积分

中级会员

Rank: 3Rank: 3

积分
472.00
发表于 2020-3-27 20:05:35 | 显示全部楼层
daike1017 发表于 2020-3-27 12:45
我是楼主
我的程序
输入:10000004

之前发了个图片,代码太笨重,水平有限,楼主试试吧
[url=][/url]

import java.util.Scanner;
public class Txet {
public static void main(String[] args) {
  Scanner input = new Scanner(System.in);
  long x = input.nextLong();
  long y = 0;
  long z = x;
  int k = 0;
  int count = 0;
  int count1 =0;
  int i = 0;
  int n = 0;
  boolean is=true;
  boolean wan = true;
  if(x<0)
  {
   x = -x;
   System.out.print("负 ");
  }  
  do
  {
   y = y*10 + x%10;
   x /=10;
   count++;
  }while(x > 0); //数据读入
  
  int []a = new int[count];
  int []b = new int[count];
  for (i=0;i<count;i++)
     {
   k = (int)(z % 10);
   if(k == 0)
   {b=1;}
   z /= 10;
     }   
        count1 = count;
        if(count>=9)
         if(b[4]==1&&b[5]==1&&b[6]==1&&b[7]==1){
         wan = false;
         }  //过亿时出现万级全零判断,可继续判断亿级
  z = y; //输出准备
  for (i=0;i<count;i++)
     {
   k = (int)(y % 10);
   if(k == 0)
   {a=1;}
   y /= 10;
     }  //倒序排列输出
         
     for (i=0;i<count;i++)
     {
      k = (int)(z % 10);
   if(k == 0) //输出时是否为0
      {
    if(count1==5 && wan ) //万位判断
          {   
        System.out.print("万");
          }
    if(count1==9 )  //亿位判断
          {   
        System.out.print("亿");
          }
    if(i==0 || i==count-1) //个位与最后一位,防止下方数组越界
    {
     System.out.print("");   
     }
    else{
    if(a[i-1]==0 && a[i+1] == 0 && count1!=5 && count1!=9)//判断单独0位
     {
     System.out.print("零");
        is = false;  //单0标记
     }
    if(is) //出现连续0进入
    {
     if(a[i-1]==0 || i==count-1){
      System.out.print("零"); //下一个出现非0输出一个零
     }
     else {
      System.out.print(""); //否则一直不输出
     }
    }}
    is = true;
   }         
   else //输出不为0时按规则输出
      {switch(k)
      {
            case 0: System.out.print("零"); break;
   case 1: System.out.print("壹"); break;
   case 2: System.out.print("贰"); break;
   case 3: System.out.print("叁"); break;
   case 4: System.out.print("肆"); break;
   case 5: System.out.print("伍"); break;
   case 6: System.out.print("陆"); break;
   case 7: System.out.print("柒"); break;
   case 8: System.out.print("捌"); break;
   case 9: System.out.print("玖"); break;
      }   
   switch(count1)
   {
   case 0: System.out.print(""); break;
   case 1: System.out.print(""); break;
   case 2: System.out.print("拾"); break;
   case 3: System.out.print("佰"); break;
   case 4: System.out.print("仟"); break;
   case 5: System.out.print("万"); break;
   case 6: System.out.print("拾"); break;
   case 7: System.out.print("佰"); break;
   case 8: System.out.print("仟"); break;
   case 9: System.out.print("亿"); break;
   case 10:System.out.print("拾"); break;
   case 11:System.out.print("佰"); break;
   case 12:System.out.print("仟"); break;
   }}
   count1--;
   z /= 10;
     }
}
}

L2.png
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-3-28 19:00:01 | 显示全部楼层
我随便写了个类,没有考虑程序结构和可读性。不过测试似乎可以了。
public class Test3 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
                //例如输入:123456789
                //输出:壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖
               
        
        String str = "1234567890123456789";//要转换的数字
        String outString = "";
        
        int strLeanth = 0;
        int grade = 0;
        
        if(str != null ){
                strLeanth = str.trim().length();
        }
        if(strLeanth > 0 ){
                grade = strLeanth/4;
        }
        Test3 t = new Test3();
        for(int i = 0 ; i<grade; i++ ){
                String temp = str.substring(strLeanth - 4 - i * 4, strLeanth - i * 4);
                System.out.println("temp  : " + temp );
                String unit = t.getUnit(i ,"");
                outString = t.analysable(temp, unit) + outString;
        }
        if(strLeanth % 4 > 0){
                String temp = str.substring(0, strLeanth % 4);
                System.out.println("temp  : " + temp );
                String unit = t.getUnit(grade ,"");
                outString = t.analysable(temp, unit) + outString;
            }
        System.out.println("outString  : " + outString );
        }
       
        /**
         * 得到单位
         * @param thisUnit
         * @param unit
         * @return
         */
        public String getUnit(int thisUnit ,String unit){
               
                if((thisUnit - 2) <= 0){
                        if(thisUnit == 1){
                            unit = "萬" + unit;
                    }else if(thisUnit == 2){
                            unit = "亿" + unit;
                    }
                }else{
                        unit = getUnit(thisUnit - 2 ,"亿"+unit);
                }
                return unit;
        }
       
       
       
        /*
         * umStr 4位以内的数字字符串
         * unit 只有3中:"","萬" 或 "亿"
         */
        public String analysable(String umStr, String unit){
                String [] n=new String[10];
        n[0]="零";
        n[1]="壹";
        n[2]="贰";
        n[3]="叁";
        n[4]="肆";
        n[5]="伍";
        n[6]="陆";
        n[7]="柒";
        n[8]="捌";
        n[9]="玖";
        
        String [] d=new String[10];
        d[0] = "";
        d[1]="拾";
        d[2]="佰";
        d[3]="仟";
        d[4]="萬";
        d[5]="亿";
        
                String reading = "";
                for(int i = 0; i < umStr.length() ; i++){
                        String temp = umStr.substring(umStr.length() - 1 - i, umStr.length() - i);
                        reading = n[new Integer(temp).intValue()]+d[i] + reading;
                }
                return reading + unit;
        }

}
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-3-30 22:30:01 | 显示全部楼层
楼主你加了判断后还有什么问题?比如用什么数字测得时候会出现问题?
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-31 09:00:01 | 显示全部楼层
晕。挺是问题,我以前见过这样的算法,是银行金额转换的问题还没想出来,主要是算法上的问题实现不难。。。
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-3 11:45:01 | 显示全部楼层
不好意思,之前没有针对 String str = "01000040";//要转换的数字 作判断现在修改后因该何以了。没有详细考虑算法 和 程序结构及可读性。

public class Test3 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
        String str = "01000040";//要转换的数字
        String outString = "";
        
        int strLeanth = 0;
        int grade = 0;
        
        if(str != null ){
                strLeanth = str.trim().length();
        }
        if(strLeanth > 0 ){
                grade = strLeanth/4;
        }
        Test3 t = new Test3();
        
        for(int i = 0 ; i<grade;  ){
                String temp = str.substring(strLeanth - 4 - i * 4, strLeanth - i * 4);
                System.out.println("temp  : " + temp );
                String unit = t.getUnit(i ,"");
                i++;
                if(strLeanth % 4 == 0 && i == grade)
                {
                        outString = t.analysable(temp, unit,false) + outString;
                }else{
                        outString = t.analysable(temp, unit,true) + outString;
                }
               
               
        //        System.out.println("outString  : " + outString );
        }
        if(strLeanth % 4 > 0){
                String temp = str.substring(0, strLeanth % 4);
                //System.out.println("temp  : " + temp );
                String unit = t.getUnit(grade ,"");
                outString = t.analysable(temp, unit , false) + outString;
            }
        System.out.println("outString  : " + outString );
        }
       
        /**
         * 得到单位
         * @param thisUnit
         * @param unit
         * @return
         */
        public String getUnit(int thisUnit ,String unit){
               
                if((thisUnit - 2) <= 0){
                        if(thisUnit == 1){
                            unit = "萬" + unit;
                    }else if(thisUnit == 2){
                            unit = "亿" + unit;
                    }
                }else{
                        unit = getUnit(thisUnit - 2 ,"亿"+unit);
                }
                return unit;
        }
       
        /*
         * umStr 4位以内的数字字符串
         * unit 只有3中:"","萬" 或 "亿"
         * lool 用来判断之前是否还有其他位 有:true
         */
        public String analysable(String umStr, String unit ,boolean lool){
                String [] n=new String[10];
        n[0]="零";
        n[1]="壹";
        n[2]="贰";
        n[3]="叁";
        n[4]="肆";
        n[5]="伍";
        n[6]="陆";
        n[7]="柒";
        n[8]="捌";
        n[9]="玖";
        
        String [] d=new String[10];
        d[0] = "";
        d[1]="拾";
        d[2]="佰";
        d[3]="仟";
        d[4]="萬";
        d[5]="亿";
        
                String reading = "";
                String tempReading = "";
                for(int i = umStr.length()-1 ; i > 0 ; i--){
                        String temp = umStr.substring(umStr.length() - i, umStr.length() - i + 1 );
                        //System.out.println("reading  : " + temp );
                        System.out.println(" === " + ((unit.length() > 0 ||  i > 0 ) && new Integer(temp).intValue() == 0));
                        if((unit.length() > 0 ||  i > 0 ) && new Integer(temp).intValue() == 0){
                                tempReading = n[new Integer(temp).intValue()] ;
                                //System.out.println("tempReading  : " + tempReading );
                        }else{
                                if(lool){
                                        reading = reading + tempReading + n[new Integer(temp).intValue()]+d[i-1];
                                }else
                                {
                                        lool = true;
                                        reading = n[new Integer(temp).intValue()]+d[i-1];
                                }
                                System.out.println("reading  : " + reading );
                        }
                }
                return reading + unit;
        }

}
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-4 16:30:02 | 显示全部楼层
有个错误  
上面
for(int i = umStr.length()-1 ; i > 0 ; i--)
那一行改成:
for(int i = umStr.length() ; i > 0 ; i--)
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-4 22:15:01 | 显示全部楼层
呵呵   还有一个错
相应的方法换成:
/*
         * umStr 4位以内的数字字符串
         * unit 只有3中:"","萬" 或 "亿"
         * lool 用来判断之前是否还有其他位 有:true
         */
        public String analysable(String umStr, String unit ,boolean lool){
                String [] n=new String[10];
        n[0]="零";
        n[1]="壹";
        n[2]="贰";
        n[3]="叁";
        n[4]="肆";
        n[5]="伍";
        n[6]="陆";
        n[7]="柒";
        n[8]="捌";
        n[9]="玖";
        
        String [] d=new String[10];
        d[0] = "";
        d[1]="拾";
        d[2]="佰";
        d[3]="仟";
        d[4]="萬";
        d[5]="亿";
        
                String reading = "";
                String tempReading = "";
                for(int i = umStr.length() ; i > 0 ; i--){
                        String temp = umStr.substring(umStr.length() - i, umStr.length() - i + 1 );
                        System.out.println("reading  : " + temp );
                        if((unit.length() > 0 ||  i > 0 ) && new Integer(temp).intValue() == 0){
                                tempReading = "零" ;
                                //System.out.println("tempReading  : " + tempReading );
                        }else{
                                if(lool){
                                        reading = reading + tempReading + n[new Integer(temp).intValue()]+d[i-1];
                                        tempReading = "";
                                }else
                                {
                                        lool = true;
                                        reading = n[new Integer(temp).intValue()]+d[i-1];
                                }
                                System.out.println("reading  : " + reading );
                        }
                }
                return reading + unit;
        }
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-4-10 12:45:01 | 显示全部楼层
以前用delphi写过个数字和汉字的转换,我觉得“零”的处理是容易出错的;然后是容易漏掉一些特殊情况。
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-4-10 18:45:01 | 显示全部楼层
我写了个
有问题提出来大家一起讨论:)

import java.io.*;
public class NumberConversion {

       
        public static void main(String[] args) {
                String s=null;
                try {
                        s = getString();
                } catch (IOException e) {
                       
                        e.printStackTrace();
                }
                int a=Integer.parseInt(s);
               
                 
                System.out.println(saparateNumber(a));

        }
        //分离数据
        public static String saparateNumber(int a){
                String str="";
                int i=0;
                boolean yi=false;
                boolean wan=false;
                if(a>=100000000){
                        str+=conversionCapitalization2(a/100000000)+"亿";
                        if(a/100000000<1000)
                                str=str.substring(1);
                        a=a%100000000;
                        yi=true;
                       
                }
                if(a>=10000){
                        str+=conversionCapitalization2(a/10000)+"萬";
                        if(a/10000<1000&&yi==false)
                                str=str.substring(1);
                        a=a%10000;
                        wan=true;
                       
                }
                if(a>0){
                       
       
                        str+=conversionCapitalization2(a/1);
                        if(a<1000&&wan==false)
                                str=str.substring(1);
                       
                }
                return str;
        }
       
        //转大写
        public static String conversionCapitalization(int a){
                String cpzat ="";
                switch (a){
                case 0:
                        cpzat="零";
                        break;
                case 1:
                        cpzat="壹";
                        break;
                case 2:
                        cpzat="贰";
                        break;
                case 3:
                        cpzat="叁";
                        break;
                case 4:
                        cpzat="肆";
                        break;
                case 5:
                        cpzat="伍";
                        break;
                case 6:
                        cpzat="陆";
                        break;
                case 7:
                        cpzat="柒";
                        break;
                case 8:
                        cpzat="捌";
                        break;
                case 9:
                        cpzat="玖";
                        break;
               
                       
                       
                       
                }
               
                return cpzat;
        }
        public static String conversionCapitalization2(int a){
                String tr="";
                boolean q=false;
                boolean b=false;
                boolean s=false;
               
                        if(a>=1000){
                               
                                tr+=conversionCapitalization(a/1000)+"仟";
                                a=a%1000;
                                q=true;
                        }
                        if(a>=100){
                                if(q==true)
                                        tr+=conversionCapitalization(a/100)+"佰";
                                else
                                        tr+="零"+conversionCapitalization(a/100)+"佰";
                                a=a%100;
                                b=true;
                        }
                        if(a>=10){
                                if(b==true)
                                        tr+=conversionCapitalization(a/10)+"拾";
                                else
                                        tr+="零"+conversionCapitalization(a/10)+"拾";
                                a=a%10;
                                s=true;
                        }
                        if(a>0){
                                if(s==true)
                                        tr+=conversionCapitalization(a/1);
                                else
                                        tr+="零"+conversionCapitalization(a/1);
                        }
                       
                return tr;
       
        }
        public static String getString() throws IOException{
                InputStreamReader isr=new InputStreamReader(System.in);
                BufferedReader br=new BufferedReader(isr);
               
               
                return br.readLine();
               
        }

}
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-4-24 09:30: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();

  public Convert(char[] num)
  {
    num_char=num;
  }
  public String toString()
  {
    int 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 && i!=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){}
  }
}
回复

使用道具 举报

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

本版积分规则

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

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