VerySource

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

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

  [复制链接]

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-31 00:30:01 | 显示全部楼层
昨天用vc做的
void CNumDlg::AddStr(CString sStr, CString *sNum, TCHAR tcUnit)
{
        int t = sStr.GetLength();
        CString sTemp = _T("");
        for (int i=0; i<t; i++)
        {
                TCHAR tcTemp = sStr.GetAt(t-1-i);
                switch (tcTemp)
                {
                case _T('0'):
                        if (sTemp == _T("") || sTemp.GetAt(0) == _T('零'))
                        {
                                break;
                        }
                        else
                        {
                                sTemp.Insert(0, _T("零"));
                        }
                        break;
                case _T('1'):
                        sTemp.Insert(0, _T("壹"));
                        break;
                case _T('2'):
                        sTemp.Insert(0, _T("贰"));
                        break;
                case _T('3'):
                        sTemp.Insert(0, _T("叁"));
                        break;
                case _T('4'):
                        sTemp.Insert(0, _T("肆"));
                        break;
                case _T('5'):
                        sTemp.Insert(0, _T("伍"));
                        break;
                case _T('6'):
                        sTemp.Insert(0, _T("陆"));
                        break;
                case _T('7'):
                        sTemp.Insert(0, _T("柒"));
                        break;
                case _T('8'):
                        sTemp.Insert(0, _T("捌"));
                        break;
                case _T('9'):
                        sTemp.Insert(0, _T("玖"));
                        break;
                default:
                        break;
                }
                switch(i)
                {
                case 0:
                        break;
                case 1:
                        if (sTemp != _T("") && sTemp.GetAt(0) != _T('零'))
                        {
                                sTemp.Insert(1, _T("拾"));
                        }
                        break;
                case 2:
                        if (sTemp != _T("") && sTemp.GetAt(0) != _T('零'))
                        {
                                sTemp.Insert(1, _T("佰"));
                        }
                        break;
                case 3:
                        if (sTemp != _T("") && sTemp.GetAt(0) != _T('零'))
                        {
                                sTemp.Insert(1, _T("仟"));
                        }
                        break;
                default:
                        break;
                }
        }
        if (tcUnit != (TCHAR)0 && sTemp!= _T(""))
        {
                sNum->Insert(0,tcUnit);
        }
        else
        {
                if (tcUnit == _T('亿'))
                {
                        sNum->Insert(0,tcUnit);
                }
        }
        sNum->Insert(0,sTemp);
}

void CNumDlg::OnRead()
{
        // TODO: Add your control notification handler code here
        UpdateData(TRUE);
        CString sNum = _T("");
        int t = m_sNum.GetLength();
        while (true)
        {
                if (t>0 && m_sNum.GetAt(0) == _T('0'))
                {
                        m_sNum.Delete(0);
                        t--;
                        continue;
                }
                break;
        }
        if (t<=0)
        {
                MessageBox(_T("您的输入错误!"));
                return;
        }
        for (int i = 0; i<t; i++)
        {
                TCHAR tc = m_sNum.GetAt(i);

                if (!_istdigit(tc))
                {
                        MessageBox(_T("请输入数字!"));
                        return;
                }
        }
        if (t<=4)
        {
                AddStr (m_sNum, &sNum, (TCHAR)0);
        }
        if (t>4 && t<=8)
        {
                CString sTh;
                sTh = m_sNum.Right(4);
                AddStr (sTh, &sNum, (TCHAR)0);
                CString sM;
                sM = m_sNum.Left(m_sNum.GetLength() - 4);
                AddStr (sM, &sNum, _T('万'));
        }
        if (t>8 && t<=12)
        {
                CString sTh;
                sTh = m_sNum.Right(4);
                AddStr (sTh, &sNum, (TCHAR)0);
                CString sM;
                sM = m_sNum.Mid(m_sNum.GetLength()-8, 4);
                AddStr (sM, &sNum, _T('万'));
                CString hM;
                hM = m_sNum.Left(m_sNum.GetLength() - 8);
                AddStr (hM, &sNum, _T('亿'));
        }
        if (t>12 && t<=16)
        {
                CString sTh;
                sTh = m_sNum.Right(4);
                AddStr (sTh, &sNum, (TCHAR)0);
                CString sM;
                sM = m_sNum.Mid(m_sNum.GetLength()-8, 4);
                AddStr (sM, &sNum, _T('万'));
                CString hM;
                hM = m_sNum.Mid(m_sNum.GetLength()-12, 4);
                AddStr (hM, &sNum, _T('亿'));
                CString mHM;
                mHM = m_sNum.Left(m_sNum.GetLength() - 12);
                AddStr (mHM, &sNum, _T('万'));
        }
        if (sNum.GetAt(0)==_T('零'))
        {
                sNum.Delete(0);
        }
        m_sRead = sNum;
        UpdateData(FALSE);
}
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-3 12:15:02 | 显示全部楼层
package num;

public class NumReader {

        public static String[] n = new String[10];
       
        public static String[] d = new String[6];
       
        static {
                n[0] = "零";
                n[1] = "壹";
                n[2] = "贰";
                n[3] = "叁";
                n[4] = "肆";
                n[5] = "伍";
                n[6] = "陆";
                n[7] = "柒";
                n[8] = "捌";
                n[9] = "玖";
               
        d[0] = "";
        d[1] = "拾";
        d[2] = "佰";
        d[3] = "仟";
        d[4] = "萬";
        d[5] = "亿";
        }

        public static String readNum(String num) {
                if(!checkParam(num)){
                        System.out.println(num + " is not a valid number");
                }
                StringBuffer sb = new StringBuffer();
               
                int len = num.length();
                String[] numbers = new String[len];
                String[] units = new String[len];
                boolean[] numFlags = new boolean[len];
                boolean[] unitFlags = new boolean[len];
               
                //caculate every pos
                for(int i=0;i<len;i++){
                        Result rs = read(num,i);
                        numbers[i] = rs.number;
                        units[i] = rs.unit;
                        numFlags[i] = rs.numFlag;
                        unitFlags[i] = rs.unitFlag;
                       
//                        join string
                        if(numFlags[i]){
                                sb.append(numbers[i]);
                        }
                        if(unitFlags[i]){
                                sb.append(units[i]);
                        }
                }
               
                return sb.toString();
        }

        public static boolean checkParam(String num) {
                try {
                        Double.parseDouble(num);
                } catch (NumberFormatException e) {
                        return false;
                }
                return true;
        }

        public static Result read(String num, int pos) {
                Result rs = new Result();
                rs.number = readNum(num,pos);
                rs.unit = readUnit(num,pos);
                rs.numFlag = readNumFlag(num,pos);
                rs.unitFlag = readUnitFlag(num,pos);
                return rs;
        }
       
        public static String readNum(String num, int pos) {
                int value = Integer.parseInt(num.substring(pos,pos+1));
                return n[value];
        }
       
        public static String readUnit(String num, int pos) {
                int len = num.length();
                int count = len - pos - 1;
               
                int unit = count % 4;
                String unitStr = d[unit];
               
                int rate = count / 4;
                if( count >= 4 && count % 4 == 0){
                        if(rate % 2 == 0){
                                unitStr += d[5];
                        } else {
                                unitStr += d[4];
                        }
                }
                return unitStr;
        }

        public static boolean readNumFlag(String num, int pos) {
                int len = num.length();
                int value = Integer.parseInt(num.substring(pos,pos+1));
                int count = len - pos - 1;
                if( len %4 == 2 &&  value == 1 && pos == 0){
                        return false;
                }
                if(value != 0){
                        return true;
                }
       
                if ( count % 4 == 0 ){
                        return false;
                }
                int nextValue = Integer.parseInt(num.substring(pos + 1,pos+2));
                if(nextValue != 0){
                        return true;
                }
                return false;
        }

        public static boolean readUnitFlag(String num, int pos) {
                int value = Integer.parseInt(num.substring(pos,pos+1));
                if(value != 0){
                        return true;
                }
                int len = num.length();
                int count = len - pos - 1;
                if ( count % 4 == 0 ){
                        return true;
                }
                return false;
        }
       
        public static class Result{
                String number = null;
                String unit = null;
                boolean numFlag = false;
                boolean unitFlag = false;
        }
       
        public static void main(String[] args) {
                String testNum = "123456789012345678";
                String str = readNum(testNum);
                System.out.println(testNum);
                System.out.println(str);
        }
}
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-27 20:15:01 | 显示全部楼层
找了半天,没看到一个好算法,我记得以前有个用树来求的,代码很简洁!
回复

使用道具 举报

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

本版积分规则

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

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