这是google的一道面试题.将汉字转换成数字, 如下 
一          1 
十          10 
十一        11 
二十        20 
二十一      21 
一百        100 
一百零一    101 
一百一十    110 
一百一十一  111 当然算法要能将所有的汉字数字转换成阿拉伯数字,同时兼顾性能.路过的大家不妨试试看... ...

解决方案 »

  1.   

    for 循环 ,switch 循环 先转换成字符串,然后Integer.valueOf(""),变成字符。。我想到的,,期待大侠更好的方法
      

  2.   

    曾经在csdn讨论了n多遍的问题了。
      

  3.   


    int iRes = 0;
    while(c = getnext()) {
        if( c 是 一到九){
            iRes += (int)(c);
      } else if (c 是 百){
            iRes *= 100;
        } else if (c 是 十){
            iRes *= 10;
        }
        .....
    }随便写的流程,看看对不对。
      

  4.   

    曾经在csdn讨论了n多遍的问题了。
      

  5.   

    #include   <iostream>   
      using   namespace   std;   
        
      int   main()   
      {   
              int   numW;   
              int   number;   
              const   int   iSize=10;   
              const   char   *Number[]=   {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};   
              const   char   *Other[]={"元","角","分","元整"};   
              const   char   *zi[]={"拾","佰","千","万","拾","百","仟","亿"   };   
              int   FNumW(int   namber);   
              int   *FFen(int   number,int   aNum[],int   aSize);   
                      
              cout<<"请输入一个正整数:\n";     
                
              cin>>number;   
                
              if(number>0)   
                      numW=FNumW(number);   
              else   if(number==0)   
                      numW=1;   
                        
              cout<<"您输入的金额是:"<<number<<"位数是"<<numW<<"\n";     
                
              int   aNumber[numW];   
              FFen(number,aNumber,numW);   
              cout<<"您输入的金额的大写形式是:\n";   
                
                
              for(int   i=0;i<numW;i++)   
              {   
                      switch(aNumber[i])   
                      {   
                                                                                        
                              case   1:   
                                      cout<<Number[1];   
                                      break;   
                              case   2:   
                                      cout<<Number[2];   
                                      break;   
                              case   3:   
                                      cout<<Number[3];   
                                      break;   
                              case   4:   
                                      cout<<Number[4];   
                                      break;   
                              case   5:   
                                      cout<<Number[5];   
                                      break;   
                              case   6:   
                                      cout<<Number[6];   
                                      break;   
                              case   7:   
                                      cout<<Number[7];   
                                      break;   
                              case   8:   
                                      cout<<Number[8];   
                                      break;   
                              case   9:   
                                      cout<<Number[9];   
                                      break;   
                                        
                      }   
                        
                      if((numW-i)%5==0&&numW<10)//处理万位。     
                      {   
                              cout<<"万";   
                      }           
                        
                      if(aNumber[i]!=0)   
                      {   
                              switch(numW-i)   
                              {   
                                      case   1:   
                                              cout<<Other[3];   
                                              break;   
                                      case   2:   
                                              cout<<zi[0];   
                                              break;   
                                      case   3:   
                                              cout<<zi[1];   
                                              break;   
                                      case   4:   
                                              cout<<zi[2];   
                                              break;   
                                      //case   5:                     //万位单独处理。     
                                      //         cout<<zi[3];   
                                      //         break;   
                                      case   6:   
                                              cout<<zi[4];   
                                              break;   
                                      case   7:   
                                              cout<<zi[5];   
                                              break;   
                                      case   8:   
                                              cout<<zi[6];   
                                              break;   
                                      case   9:   
                                              cout<<zi[7];   
                                              break;   
                              }           
                    }   
                    else   if(aNumber[i]==0&&i==numW-1)   
                    {   
                            cout<<Other[3];   
                    }   
                      
                    else   if(aNumber[i]==0&&aNumber[i+1]!=0)   
                    {   
                            cout<<Number[0];     
                    }   
                      
              }   
                
              cout<<"\n";   
              system("pause");   
        
      }   
        
      int   FNumW(int   number)   //求任意整型数据的位数     
      {   
              int   numW=0;   
              while(number!=0)   
                      {   
                              number=number/10;   
                              numW++;   
                      }   
              return   numW;   
      }   
        
      int   *FFen(int   number,int   aNum[],int   numW)//用数组保存任意整型数据的每一位数     
      {   
                
              while(number!=0)   
              {   
                      aNum[numW-1]=number%10;   
                      numW--;   
                      number=number/10;   
              }   
              return   aNum;   
      }   
      
    C++版的
      

  6.   

    我在做POJ上的水题,上面的很多水题比这个恶心多了,不是真的能进google吧
      

  7.   

    public class GetDot {private final static String[] a_strNumber = { "零", "壹", "贰", "叁", "肆", "伍",
    "陆", "柒", "捌", "玖" };private final static String[] a_strModify = { "", "拾", "佰", "仟", "万", "拾",
    "佰", "仟", "亿", "拾", "佰", "仟" };public static void main(String[] args) throws Exception {GetDot dot = new GetDot();String str = "-101.23";
    String getSign = dot.getSign(str);
    String getFraction = dot.getFraction(str);
    String getDot = dot.getDot(str);
    String getInteger = dot.getInteger(str);
    System.out.println("========" + getSign + getInteger + getDot
    + getFraction);}/*
    * 得到符号位,如果输入的是正数就返回" ",否则就返回负号
    */
    public String getSign(String pValue) {return pValue.indexOf("-") == 0 ? "负" : " ";
    }/*
    * 得到小数部分的汉字,如10.23,就输出贰叁
    */
    public String getFraction(String pValue) {String strFraction = null;int intDotPos = pValue.indexOf(".");
    if (-1 == intDotPos)
    return "";
    strFraction = pValue.substring(intDotPos + 1);
    System.out.println("have it" + strFraction);
    StringBuilder sbResulet = new StringBuilder(strFraction.length());for (int i = 0; i < strFraction.length(); i++) {
    System.out.println("have it In" + strFraction);sbResulet.append(a_strNumber[strFraction.charAt(i) - 48]);
    }
    return sbResulet.toString();
    }/*
    * 得到整数部分的数据
    */
    public String getInteger(String pValue) {System.out.println("============");
    String strInteger = null;int intDotPos = pValue.indexOf(".");int intSignPos = pValue.indexOf("-");if (intDotPos == -1) {intDotPos = pValue.length();
    }strInteger = pValue.substring(intSignPos + 1, intDotPos);
    /*
    * 反转strInteger
    */
    strInteger = new StringBuffer(strInteger).reverse().toString();
    System.out.println("StrInteger====" + strInteger);
    StringBuilder sbResult = new StringBuilder();for (int i = 0; i < strInteger.length(); i++) {
    sbResult.append(a_strModify);
    sbResult.append(a_strNumber[strInteger.charAt(i) - 48]);
    }
    /*
    * 在反转
    */sbResult = sbResult.reverse();
    return sbResult.toString();
    }/*
    * 得到小数点
    */
    public String getDot(String pValue) {return pValue.indexOf(".") != -1 ? "点" : "";
    }
    }
      

  8.   

    这种答案google上一找就找到,但是poj上的题可不是你想找就能找到的
      

  9.   

    private final String SHI="十";
    private final String BAI="百";
    private final String QIAN="千";
    private final String WAN="万";
    private final String SHIWAN="十万";
    private final String BAIWAN="百万";
    private final String QIANWAN="千万";
    private final String YI="亿";根据数字的位数可以计算出一个周期是9位数字,共计8种单位
    个十百千万(十万)(百万)(千万)(亿)
    1 2 3 4 5 6 7 8 9
    从数字到汉字: 首先得出数字的长度,确定用到的单位集合。
     然后倒序加单位,最后一位不加单位,上一位加SHI,在上一位加百,可以将上面的所有单位放进数组中,按照数组下标递增依次给每一位数字加单位。再将数字直接转换成汉字数字就行了。从汉字到数字:
        。。找最大的单位,确定数字长度,然后单位从大到小依次从左向右取出单位前的汉字数字排列,最后将汉字数字全部换成数字。
      

  10.   

    public class zhtonumber {
        static HashMap<String,Integer> flag = new HashMap<String,Integer>();
    static int bz = -1;
    static long temp = 0; /**
     * @param args
     */
    public static void main(String[] args) {
    String[]  inputs = {"一百一十万万零五百六十四","三千五百万六十三","三十","一十二","三十千万零六百"}; 
    flag.put("亿",10000000);
    flag.put("万", 10000);
    flag.put("千", 1000);
    flag.put("百", 100);
    flag.put("十", 10);
    flag.put("一", 1);
    flag.put("二", 2);
    flag.put("三", 3);
    flag.put("四", 4);
    flag.put("五", 5);
    flag.put("六", 6);
    flag.put("七", 7);
    flag.put("八", 8);
    flag.put("九", 9);
    for(String input:inputs){
    input = input.replaceAll("零", "");
    temp = 0;
    getNumber(input);
    System.out.println(temp);
    } }
    public static void getNumber(String input){
    if(input.length()<1) return; 
    int i = 0; 
    for(int k=0;k<input.length();k++){
    if(flag.get(input.substring(k,k+1))<10){
    i = k;
    break;
    }
    }
    for(int j=0;j<i;j++){
    if(bz==-1) bz=flag.get(input.substring(j,j+1));
    temp=temp*flag.get(input.substring(j,j+1));
    if(j==i-1)bz = flag.get(input.substring(j,j+1));
    }
    input = input.substring(i,input.length());
    if(input.length()==0) return;
    String t1 = input.substring(0,1);
    if(flag.get(t1)>10){
    bz = flag.get(t1);
    temp = temp*flag.get(t1);
    getNumber(input.substring(1, input.length()));
    return;
    }
    if(input.length()>1){
    String t2 = input.substring(1,2);
    if(bz==-1)bz=flag.get(t2);
    if(bz<=flag.get(t2)){
    bz=flag.get(t2);
    temp +=flag.get(t1);
    temp = temp*flag.get(t2);
    }else{
    bz = flag.get(t2);
    temp += flag.get(t1)*flag.get(t2);
    }
    getNumber(input.substring(2, input.length()));  
    }else{
    temp+=flag.get(t1);
    return ;
    }  
    return ;
    }  
    }
    匆匆写的
      

  11.   

    public class zhtonumber {
        static HashMap<String,Integer> flag = new HashMap<String,Integer>();
    static int bz = -1;
    static long temp = 0; /**
     * @param args
     */
    public static void main(String[] args) {
    String[]  inputs = {"一百一十万万零五百六十四","三千五百万六十三","三十","一十二","三十千万零六百"}; 
    flag.put("亿",10000000);
    flag.put("万", 10000);
    flag.put("千", 1000);
    flag.put("百", 100);
    flag.put("十", 10);
    flag.put("一", 1);
    flag.put("二", 2);
    flag.put("三", 3);
    flag.put("四", 4);
    flag.put("五", 5);
    flag.put("六", 6);
    flag.put("七", 7);
    flag.put("八", 8);
    flag.put("九", 9);
    for(String input:inputs){
    input = input.replaceAll("零", "");
    temp = 0;
    getNumber(input);
    System.out.println(temp);
    } }
    public static void getNumber(String input){
    if(input.length()<1) return; 
    int i = 0; 
    for(int k=0;k<input.length();k++){
    if(flag.get(input.substring(k,k+1))<10){
    i = k;
    break;
    }
    }
    for(int j=0;j<i;j++){
    if(bz==-1) bz=flag.get(input.substring(j,j+1));
    temp=temp*flag.get(input.substring(j,j+1));
    if(j==i-1)bz = flag.get(input.substring(j,j+1));
    }
    input = input.substring(i,input.length());
    if(input.length()==0) return;
    String t1 = input.substring(0,1);
    if(flag.get(t1)>10){
    bz = flag.get(t1);
    temp = temp*flag.get(t1);
    getNumber(input.substring(1, input.length()));
    return;
    }
    if(input.length()>1){
    String t2 = input.substring(1,2);
    if(bz==-1)bz=flag.get(t2);
    if(bz<=flag.get(t2)){
    bz=flag.get(t2);
    temp +=flag.get(t1);
    temp = temp*flag.get(t2);
    }else{
    bz = flag.get(t2);
    temp += flag.get(t1)*flag.get(t2);
    }
    getNumber(input.substring(2, input.length()));  
    }else{
    temp+=flag.get(t1);
    return ;
    }  
    return ;
    }  
    }
      

  12.   

    google一下,网上很多,10分钟足够了
      

  13.   

    这题还用30分钟?google的水平也太差了吧
      

  14.   

    用一个栈就可以实现转化:
    如果新读入的汉字(假设它代表的数字为N)比栈顶数字还要大
    {
        弹出栈中所有比N小的元素,并将这些元素累加,假设结果为S;
        将S*N入栈;
    }
    否则
    {
        将N直接入栈;
    }
    最后将栈中所有数字相加就可以。
      

  15.   

    举例:一亿一千二百五十八万三千二百四十(112,583,240)
    第1步==>处理“一”,N=1
    直接入栈,
    此时栈中元素为:1 (右侧是栈顶)
    第2步==>处理“亿”,N=100000000
    弹出栈中唯一的元素,然后S=1,将S*N=100000000入栈
    此时栈中元素为:100000000
    第3步==>处理“一”,N=1
    直接入栈
    栈中元素为:100000000,1
    第4步==>处理“千”,N=1000
    弹出栈中比N小的元素(只有一个),然后S=1,将S*N=1000入栈
    此时栈中元素为:100000000,1000
    第5步==>处理“二”,N=2
    直接入栈
    此时栈中元素为:100000000,1000,2
    第6步==>处理“百”,N=100
    弹出栈中比N小的元素(只有一个),然后S=2,将S*N=200入栈
    此时栈中元素为:100000000,1000,200
    第7步==>处理“五”,N=5
    直接入栈
    此时栈中元素为:100000000,1000,200,5
    第8步==>处理“十”,N=10
    弹出栈中比N小的元素(只有一个),然后S=5,将S*N=50入栈
    此时栈中元素为:100000000,1000,200,50
    第9步==>处理“八”,N=8
    直接入栈
    此时栈中元素为:100000000,1000,200,50,8
    第10步==>处理“万”,N=10000
    弹出栈中比N小的元素(有四个),然后S=1258,将S*N=12580000入栈
    此时栈中元素为:100000000,12580000
    …………
      

  16.   

    这种题目也敢来   进elgoog吧
      

  17.   

    第10步==>处理“万”,N=10000 
    弹出栈中比N小的元素(有四个),然后S=1258,将S*N=12580000入栈 
    此时栈中元素为:100000000,12580000如果“万”后面是“亿”呢?
    一亿一千二百五十八万亿
      

  18.   

    简单!
    string a,b
    if a='一'  then b='1' 
    if a='一' + '1' then b='10'
    if a='一'*2 + '一' + '1' then b='20'
    if a='一'*2 + '一' + '1'+ '一' then b='21'
    if a='一'+ '一' + ','+ '1' + '一' +'1'+'一'*2 then b='100'
    if a='一'+ '一' + ','+ '1' + '一' +'1'+'一'*2+'一' then b='101'    //汉字一百零一可翻译为一百一
    if a='一'+ '一' + ','+ '1' + '一' +'1'+'一'*2+'一'+'一' + '1' then b='110' 
    if a='一'+ '一' + ','+ '1' + '一' +'1'+'一'*2+'一'+'一' + '1'+'一'  then b='111' 
      

  19.   

    应该做出来也进不了google吧.
      

  20.   

    为什么要进google?做出来也不进google,还是回家好,嘿嘿~~
      

  21.   

    我 是可以进google  人  啊
      

  22.   

    题目描述的不是很精确
    这个问题的输入包括那些格式,哪几种?
    汉语千变万化,要表达一个数,可能的情况有很多种。
    题目中只是举出了几个例子,没有给出标准,只是在最后说要把          所有的 汉字数字  转化成阿拉伯数字所有的汉字数字——这个界定太弱了!不知道有没有统计过阿拉伯数在汉语中有多少种汉字表达方式;对于特别的数,有特别的表达方式,像上面提到的 一千一,还有 贰仟,这些特殊的表达方式又有哪些?
    如果一个算法要考虑所有可能的情况,那么这个算法绝大多数情况下会复杂的可怕,
    并且很多时候这样的算法根本不存在。
    我想,出题人的本意应该是对于常用的汉字数字,将其转化成阿拉伯数字。
    倘若出题人真的是要被试解决所有的汉字数字转化问题,那么Google真是遥不可及。
      

  23.   

    使用递归算法,基本以4位(千)为一段~
    下面是一种算法,适用于标准读法(其他非标准读法如:四万万(四亿)不算标准读法)public class MyTest{
    private static final String[] hz = {"零","一","二","三","四","五","六","七","八","九"};
    private static final Map<String, Integer> hzsz = new HashMap<String, Integer>();
    private static final Map<String, Integer> hzradix = new HashMap<String, Integer>();

    static{
    for(int i = 0; i < hz.length; i ++){
    hzsz.put(hz[i], i);
    }
    hzradix.put("十", 10);
    hzradix.put("百", 100);
    hzradix.put("千", 1000);
    hzradix.put("万", 10000);
    hzradix.put("亿", 100000000);
    }

    public static void main(String[] args){
    String src = "五十亿三千零七十五万零六百二十二";
    System.out.println(exchange1(src));
    }

    public static long exchange1(String src){
    String []tmp1 = src.split("亿");
    if(tmp1.length == 2){
    return (long)exchange2(tmp1[0]) * hzradix.get("亿") + exchange2(tmp1[1]);
    }else{
    return exchange2(tmp1[0]);
    }
    }

    public static int exchange2(String src){
    String []tmp1 = src.split("万");
    if(tmp1.length == 2){
    return exchange(tmp1[0]) * hzradix.get("万") + exchange(tmp1[1]);
    }else{
    return exchange(tmp1[0]);
    }
    }

    public static int exchange(String src){//十、百、千
    int bg = 0;
    for(int i = 0; i < src.length(); i ++){
    String c1 = ""+src.charAt(i);
    if(hzsz.containsKey(c1)){
    if(i + 1 < src.length()){
    String c2 = ""+src.charAt(i+1);
    if(hzradix.containsKey(c2)){
    bg += hzsz.get(c1) * hzradix.get(c2);
    }
    }else{
    bg += hzsz.get(c1);
    }
    }
    }
    return bg;
    }
    }
    输出结果:
    5030750622
      

  24.   

    上面代码稍改进一下,适应10-19之间的读法:如10读作“十”【一十】,11读作“十一”【一十一】等:public class MyTest{
    private static final String[] hz = {"零","一","二","三","四","五","六","七","八","九"};
    private static final Map<String, Integer> hzsz = new HashMap<String, Integer>();
    private static final Map<String, Integer> hzradix = new HashMap<String, Integer>();

    static{
    for(int i = 0; i < hz.length; i ++){
    hzsz.put(hz[i], i);
    }
    hzradix.put("十", 10);
    hzradix.put("百", 100);
    hzradix.put("千", 1000);
    hzradix.put("万", 10000);
    hzradix.put("亿", 100000000);
    }

    public static void main(String[] args){
    String[] srcs = {"一","十","十一","二十","二十一",
             "一百","一百零一","一百一十","一百一十一",
             "五十亿三千零七十五万零六百二十二",
          "十三亿三千零十五万零三百一十二"};
    for(int i = 0; i < srcs.length; i ++){
    System.out.println(exchange1(srcs[i]));
    }
    }

    public static long exchange1(String src){
    String []tmp1 = src.split("亿");
    if(tmp1.length == 2){
    return (long)exchange2(tmp1[0]) * hzradix.get("亿") + exchange2(tmp1[1]);
    }else{
    return exchange2(tmp1[0]);
    }
    }

    public static int exchange2(String src){
    String []tmp1 = src.split("万");
    if(tmp1.length == 2){
    return exchange(tmp1[0]) * hzradix.get("万") + exchange(tmp1[1]);
    }else{
    return exchange(tmp1[0]);
    }
    }

    public static int exchange(String src){//十、百、千
    int bg = 0;
    for(int i = 0; i < src.length(); i ++){
    String c1 = ""+src.charAt(i);
    if(hzsz.containsKey(c1)){
    if(c1.equals("零")){
    continue;
    }
    if(i + 1 < src.length()){
    String c2 = ""+src.charAt(i+1);
    if(hzradix.containsKey(c2)){
    bg += hzsz.get(c1) * hzradix.get(c2);
    }
    }else{
    bg += hzsz.get(c1);
    }
    }else if(i == 0 && c1.equals("十") ||//10-19之间的习惯用法
     i > 0 && c1.equals("十") && ((""+src.charAt(i-1)).equals("零"))){
    bg += 10;
    }
    }
    return bg;
    }
    }输出结果:
    1
    10
    11
    20
    21
    100
    101
    110
    111
    5030750622
    1330150312
      

  25.   

    用C#写出来花了一个半小时。,基本思想和71楼一直,先按亿拆分,再按万拆分,没有考虑兆及万万的不规则方式。
    class ChNumberToDigit
    {
    //指数
    private Dictionary<string, int> exp = new Dictionary<string, int>(3);
    //数字
    private Dictionary<string, int> num = new Dictionary<string, int>(10); public ChNumberToDigit()
    {
    //指数
    exp["十"] = 1;
    exp["百"] = 2;
    exp["千"] = 3; //数字
    num["零"] = 0;
    num["一"] = 1;
    num["二"] = 2;
    num["三"] = 3;
    num["四"] = 4;
    num["五"] = 5;
    num["六"] = 6;
    num["七"] = 7;
    num["八"] = 8;
    num["九"] = 9;
    } /// <summary>
    /// 转换函数
    /// </summary>
    /// <param name="chNumber">中文数字</param>
    /// <returns>阿拉伯数字</returns>
    public string Convert(string chNumber)
    {
    if (chNumber.Length > 0)
    {
    StringBuilder sbDigit = new StringBuilder();
    string[] forC1 = chNumber.Split('亿');
    for (int i = 0; i < forC1.Length; i++)
    {
    sbDigit.Append(C1(forC1[i]));
    } //去除开始的0
    string dig = sbDigit.ToString();
    for (int j = 0; j < 8; j++)
    {
    if (dig.Substring(j, 1) != "0")
    {
    return dig.Substring(j);
    }
    }
    return dig;
    }
    return null;
    } /// <summary>
    /// 小于亿的转换
    /// </summary>
    /// <param name="chNumber">中文数字</param>
    /// <returns>阿拉伯数字</returns>
    private string C1(string chNumber)
    {
    if (chNumber.Length == 0)
    return "00000000"; StringBuilder sbDigit = new StringBuilder();
    string[] forC2 = chNumber.Split('万');
    for (int i = 0; i < forC2.Length; i++)
    {
    sbDigit.Append(C2(forC2[i]));
    } return sbDigit.ToString().PadLeft(8, '0');
    } /// <summary>
    /// 小于万的转换
    /// </summary>
    /// <param name="chNumber">中文数字</param>
    /// <returns>阿拉伯数字</returns>
    private string C2(string chNumber)
    {
    if (chNumber.Length == 0)
    return "0000"; StringBuilder sbDigit = new StringBuilder();
    //记录指数,默认为千
    int e = 3; //记录是否发现0,如果发现则在下次指数出现后补零
    bool hasZero = false;
    if (chNumber.Substring(0, 1) == "十")
    sbDigit.Append("1");
    for (int i = 0; i < chNumber.Length; i++)
    {
    string d = chNumber.Substring(i, 1); //遇到0则置标志,待发现下一个指数后补
    if (d == "零")
    {
    hasZero = true;
    continue;
    } if (exp.ContainsKey(d))
    {//发现指数
    int newExp = exp[d];
    //补零
    if (hasZero && e - newExp > 1)
    {
    sbDigit.Insert(sbDigit.Length - 1, Zero(e - newExp - 1));
    hasZero = false;
    }
    e = newExp;
    }
    else
    {//发现数字
    sbDigit.Append(num[d]);
    }
    } //特殊处理尾部
    string last = chNumber.Substring(chNumber.Length - 1, 1);
    if (exp.ContainsKey(last))
    {//以指数结尾,则要在右边补0
    sbDigit.Append(Zero(exp[last]));
    }
    else if (e > 1)
    {//以数字结尾,则要根据最后一个出现的指数,在数字前插入足够的0
    sbDigit.Insert(sbDigit.Length - 1, Zero(e - 1));
    } //长度不足四位,要在左侧补零
    return sbDigit.ToString().PadLeft(4, '0');
    } /// <summary>
    /// 返回指定个数的0
    /// </summary>
    /// <param name="length">由0组成的字符串长度</param>
    /// <returns></returns>
    private static string Zero(int length)
    {
    return string.Empty.PadRight(length, '0');
    }
    }
      

  26.   

     private decimal GB2Num(string gb)
            {
                int prevNum = 0;
                decimal result=0;
                string fstr1="零一二三四五六七八九";
                string fstr2="十百千万亿";
                foreach (char c in gb)
                {
                    if (fstr1.IndexOf(c) >= 0)
                    {
                        result += prevNum;
                        prevNum = 0;
                        prevNum = fstr1.IndexOf(c);
                    }
                    else if (fstr2.IndexOf(c) >= 0)
                    {
                        prevNum = prevNum == 0 ? 1 : prevNum;
                        prevNum *= (int )Math.Pow(10, fstr2.IndexOf(c) + 1);
                    }
                }
                return result + prevNum;
            }
    只能是整数
      

  27.   

    #include <string>
    #include <iostream>
    using namespace std;int index(int);
    int toI(wchar_t);
    int toNum(wchar_t[]);int main()
    {
    wchar_t s0[] = L"零";
    wchar_t s1[] = L"一";
    wchar_t s2[] = L"十";
    wchar_t s3[] = L"十一";
    wchar_t s4[] = L"二十";
    wchar_t s5[] = L"二十一";
    wchar_t s6[] = L"一百";
    wchar_t s7[] = L"一百零一";
    wchar_t s8[] = L"一百一十";
    wchar_t s9[] = L"一百一十一";
    cout<<toNum(s0)<<endl;
    cout<<toNum(s1)<<endl;
    cout<<toNum(s2)<<endl;
    cout<<toNum(s3)<<endl;
    cout<<toNum(s4)<<endl;
    cout<<toNum(s5)<<endl;
    cout<<toNum(s6)<<endl;
    cout<<toNum(s7)<<endl;
    cout<<toNum(s8)<<endl;
    cout<<toNum(s9)<<endl;
    return 0;
    }int index(int n)
    {
    if(n == 0)
    return 1;
    else
    return 10 * index(n - 1);
    }int toI(wchar_t s)
    {
    wchar_t Si[] = {L'', L'一', L'二', L'三', L'四', L'五', L'六', L'七', L'八', L'九'};
    wchar_t St[] = {L'', L'十', L'百', L'千', L'万', L'', L'兆', L'', L'亿'};
    int i = 1;
    for (; i < 10; i++)
    {
    if (s == Si[i])
    return i;
    }
    for(i = 0; i < 7; i++)
    {
    if (s == St[i])
    {
    return index(i);
    }
    }
    return 0;
    }int toNum(wchar_t s[])
    {
    wchar_t e = L'';
    int n = 0, num = 0;
    int i = 0;
    for (; s[i] != e; i++)
    {
    if ((toI(s[i]) == 0)&&(n == 0))
    num = 0;
    else if ((toI(s[i]) > 9)&&(n == 0))
    num = 10;
    else if ((toI(s[i]) > 9)&&(n != 0))
    num = toI(s[i]) * num;
    else
    num += toI(s[i]);
    n++;
    }
    return num;
    }
    c++ 版
      

  28.   

    自己也写了一个练习一下
    import java.util.HashMap;public class Test_NumberFormat {    private final String UNIT_YI = "亿";
        private final String UNIT_WAN = "万";
        private final String UNIT_QIAN = "千";
        private final String UNIT_BAI = "百";
        private final String UNIT_SHI = "十";
        private final HashMap<String, Integer> UNIT = new HashMap<String, Integer>();
        private final HashMap<String, Integer> NUMBER = new HashMap<String, Integer>();    public Test_NumberFormat() {
            UNIT.put(UNIT_YI, 100000000);
            UNIT.put(UNIT_WAN, 10000);
            UNIT.put(UNIT_QIAN, 1000);
            UNIT.put(UNIT_BAI, 100);
            UNIT.put(UNIT_SHI, 10);
            NUMBER.put("一", 1);
            NUMBER.put("二", 2);
            NUMBER.put("三", 3);
            NUMBER.put("四", 4);
            NUMBER.put("五", 5);
            NUMBER.put("六", 6);
            NUMBER.put("七", 7);
            NUMBER.put("八", 8);
            NUMBER.put("九", 9);
        }    public String getArab(String strCHN) {        if (strCHN == null || strCHN.trim().equals("")) {
                return strCHN;
            }
            String strCHNTemp = strCHN.replace("零", "");
            long result = getArab(strCHNTemp, getUnit(strCHNTemp));
            return Long.toString(result);
        }    private long getArab(String strCHN, String sUNIT) {        if (sUNIT == null) {
                return NUMBER.get(strCHN);
            }
            String sArr[] = strCHN.split(sUNIT);
            long num = 0;
            if (!sArr[0].equals("")) {
                num = UNIT.get(sUNIT) * getArab(sArr[0], getUnit(sArr[0]));
            } else {
                num = UNIT.get(sUNIT);
            }
            if (sArr.length == 1) {
                return num;
            }
            return num + getArab(sArr[1], getUnit(sArr[1]));
        }    private String getUnit(String str) {        if (str == null || str.trim().equals("")) {
                return str;
            }
            if (str.contains(UNIT_YI)) {
                return UNIT_YI;
            }
            if (str.contains(UNIT_WAN)) {
                return UNIT_WAN;
            }
            if (str.contains(UNIT_QIAN)) {
                return UNIT_QIAN;
            }
            if (str.contains(UNIT_BAI)) {
                return UNIT_BAI;
            }
            if (str.contains(UNIT_SHI)) {
                return UNIT_SHI;
            }
            return null;
        }
    }
      

  29.   


    //没有考虑兆及更大单位的情况
            java.util.List<String> chnList = new java.util.ArrayList<String>();
            chnList.add("一");
            chnList.add("十");
            chnList.add("一十五");
            chnList.add("十五");
            chnList.add("二十");
            chnList.add("二十三");
            chnList.add("一百");
            chnList.add("一百零一");
            chnList.add("一百一十");
            chnList.add("一百一十一");
            chnList.add("一千");
            chnList.add("一千零一");
            chnList.add("一千零三十一");
            chnList.add("一万零一");
            chnList.add("一万零二十一");
            chnList.add("一万零三百二十一");
            chnList.add("一万一千三百二十一");
            chnList.add("三千零十五万");
            chnList.add("三千零一十五万");
            chnList.add("三千五百六十八万零一百零一");
            chnList.add("五十亿三千零七十五万零六百二十二");
            chnList.add("十三亿三千零十五万零三百一十二");
            chnList.add("三千零七十八亿三千零十五万零三百一十二");
            chnList.add("一千二百五十八亿");
            chnList.add("一千二百五十八万亿零三千三百二十一");        for (String chnStr : chnList) {
                chn2digit(chnStr);
            }    public static void chn2digit(String chnStr) {
            //init map
            java.util.Map<String, Integer> unitMap = new java.util.HashMap<String, Integer>();
            unitMap.put("十", 10);
            unitMap.put("百", 100);
            unitMap.put("千", 1000);
            unitMap.put("万", 10000);
            unitMap.put("亿", 100000000);        java.util.Map<String, Integer> numMap = new java.util.HashMap<String, Integer>();
            numMap.put("零", 0);
            numMap.put("一", 1);
            numMap.put("二", 2);
            numMap.put("三", 3);
            numMap.put("四", 4);
            numMap.put("五", 5);
            numMap.put("六", 6);
            numMap.put("七", 7);
            numMap.put("八", 8);
            numMap.put("九", 9);        //栈
            List<Long> stack = new ArrayList<Long>();
            long tempNum = 0;
            for (int i = 0; i < chnStr.length(); i++) {
                char bit = chnStr.charAt(i);
                System.out.print(bit);
                //数字
                if (numMap.containsKey(bit + "")) {                tempNum = tempNum + numMap.get(bit + "");                //一位数、末位数、亿或万的前一位进栈
                    if (chnStr.length() == 1
                        | i == chnStr.length() - 1
                        | (i + 1 < chnStr.length() && (chnStr.charAt(i + 1) == '亿' | chnStr
                            .charAt(i + 1) == '万'))) {
                        stack.add(tempNum);
                    }
                }
                //单位
                else if (unitMap.containsKey(bit + "")) {                //遇到十 转换为一十、临时变量进栈
                    if (bit == '十') {
                        if (tempNum != 0) {
                            tempNum = tempNum * unitMap.get(bit + "");
                        } else {
                            tempNum = 1 * unitMap.get(bit + "");
                        }
                        stack.add(tempNum);
                        tempNum = 0;
                    }                //遇到千、百 临时变量进栈
                    if (bit == '千' | bit == '百') {
                        if (tempNum != 0) {
                            tempNum = tempNum * unitMap.get(bit + "");
                        }
                        stack.add(tempNum);
                        tempNum = 0;
                    }                //遇到亿、万 栈中元素依次累加*单位值、清空栈、新结果值进栈
                    if (bit == '亿' | bit == '万') {
                        long tempSum = 0;
                        if (stack.size() != 0) {
                            for (int j = 0; j < stack.size(); j++) {
                                tempSum += stack.get(j);
                            }
                        } else {
                            tempSum = 1;
                        }
                        tempNum = tempSum * unitMap.get(bit + "");
                        stack.clear();//清空栈
                        stack.add(tempNum);//新结果值进栈
                        tempNum = 0;
                    }
                }
            }        //output
            System.out.println();
            long sum = 0;
            for (Long i : stack) {
                sum += i;
            }
            System.out.println(sum);
        }一
    1

    10
    一十五
    15
    十五
    15
    二十
    20
    二十三
    23
    一百
    100
    一百零一
    101
    一百一十
    110
    一百一十一
    111
    一千
    1000
    一千零一
    1001
    一千零三十一
    1031
    一万零一
    10001
    一万零二十一
    10021
    一万零三百二十一
    10321
    一万一千三百二十一
    11321
    三千零十五万
    30150000
    三千零一十五万
    30150000
    三千五百六十八万零一百零一
    35680101
    五十亿三千零七十五万零六百二十二
    50000030750622
    十三亿三千零十五万零三百一十二
    13000030150312
    三千零七十八亿三千零十五万零三百一十二
    3078000030150312
    一千二百五十八亿
    125800000000
    一千二百五十八万亿零三千三百二十一
    1258000000003321
      

  30.   

    sorry,上面代码里用到的数据结构应该是队列,注释写错了。
      

  31.   

    前面发的代码有bug,“一亿三千万”等汉字转换时结果不正确。 更换数据结构和算法如下: 
    java.util.List<String> chnNumList = new java.util.ArrayList<String>();
    chnNumList.add("一");
    chnNumList.add("十");
    chnNumList.add("一十五");
    chnNumList.add("十五");
    chnNumList.add("二十");
    chnNumList.add("二十三");
    chnNumList.add("一百");
    chnNumList.add("一百零一");
    chnNumList.add("一百一十");
    chnNumList.add("一百一十一");
    chnNumList.add("一千");
    chnNumList.add("一千零一");
    chnNumList.add("一千零三十一");
    chnNumList.add("一万零一");
    chnNumList.add("一万零二十一");
    chnNumList.add("一万零三百二十一");
    chnNumList.add("一万一千三百二十一");
    chnNumList.add("三千零十五万");
    chnNumList.add("三千零一十五亿");
    chnNumList.add("三千五百六十八万零一百零一");
    chnNumList.add("五十亿三千零七十五万零六百二十二");
    chnNumList.add("十三亿三千零十五万零三百一十二");
    chnNumList.add("三千零七十八亿三千零十五万零三百一十二");
    chnNumList.add("一千二百五十八亿");
    chnNumList.add("二十一亿三千万");
    chnNumList.add("一亿三千万");
    chnNumList.add("一亿零三千万");
    chnNumList.add("一千二百五十八万亿零三千三百二十一"); for (String chnNum : chnNumList) {
    chnNum2Digit(chnNum);
    }
    } // 没有考虑兆及更大单位情况
    public static void chnNum2Digit(String chnNum) {
    // initialize map
    java.util.Map<String, Integer> unitMap = new java.util.HashMap<String, Integer>();
    unitMap.put("个", 1);// 仅在数据存储时使用
    unitMap.put("十", 10);
    unitMap.put("百", 100);
    unitMap.put("千", 1000);
    unitMap.put("万", 10000);
    unitMap.put("亿", 100000000); java.util.Map<String, Integer> numMap = new java.util.HashMap<String, Integer>();
    numMap.put("零", 0);
    numMap.put("一", 1);
    numMap.put("二", 2);
    numMap.put("三", 3);
    numMap.put("四", 4);
    numMap.put("五", 5);
    numMap.put("六", 6);
    numMap.put("七", 7);
    numMap.put("八", 8);
    numMap.put("九", 9); // 数据存储结构:
    // 单位 数量
    // "个" num
    // "十" num
    // "百" num
    // "千" num
    // "万" num
    // "亿" num
    java.util.Map<String, Long> dataMap = new java.util.LinkedHashMap<String, Long>(); // 保存"亿"或"万"之前存在的多位数
    java.util.List<Long> mulitNumList = new java.util.ArrayList<Long>(); long tempNum = 0;
    for (int i = 0; i < chnNum.length(); i++) {
    char bit = chnNum.charAt(i);
    System.out.print(bit); // 因为"亿"或"万"存在多位情况,所以需要进行判断
    boolean isExist = false;
    // 存在"亿"或"万"情况(不计算当前索引位)
    if ((chnNum.indexOf('亿', i) != -1 || chnNum.indexOf('万', i) != -1)
    && chnNum.charAt(i) != '亿' && chnNum.charAt(i) != '万') {
    isExist = true;
    } // 数字
    if (numMap.containsKey(bit + "")) {
    if (i != chnNum.length() - 1) {
    tempNum = tempNum + numMap.get(bit + "");
    }
    // 最末位数字情况
    else {
    dataMap.put("个", Long.valueOf(numMap.get(bit + "") + ""));
    tempNum = 0;
    }
    } else if (bit == '亿') {
    // 存在"万亿"情况,取出"万"位值*10000,0000后重新put到map
    if (i - 1 >= 0 && chnNum.charAt(i - 1) == '万') {
    Long dataValue = dataMap.get("万");
    if (dataValue != null && dataValue > 0) {
    dataMap.put("万", dataValue * unitMap.get(bit + ""));
    }
    continue;
    } // 最后一位数进list等待处理
    if (tempNum != 0) {
    mulitNumList.add(tempNum);
    }
    // 处理"亿"之前的多位数
    long sum = 0;
    for (Long num : mulitNumList) {
    sum += num;
    }
    mulitNumList.clear();
    dataMap.put("亿", sum);
    tempNum = 0;
    } else if (bit == '万') {
    // 最后一位数进list等待处理
    if (tempNum != 0) {
    mulitNumList.add(tempNum);
    }
    // 处理"万"之前的多位数
    long sum = 0;
    for (Long num : mulitNumList) {
    sum += num;
    }
    mulitNumList.clear();
    dataMap.put("万", sum);
    tempNum = 0;
    } else if (bit == '千' && tempNum > 0) {
    // 存在"亿"或"万"情况,临时变量值*"千"单位值进list等待处理
    if (isExist) {
    mulitNumList.add(tempNum * unitMap.get(bit + ""));
    tempNum = 0;
    }
    // 不存在"亿"或"万"情况,临时变量值put到map相应位
    else {
    dataMap.put("千", tempNum);
    tempNum = 0;
    }
    } else if (bit == '百' && tempNum > 0) {
    // 存在"亿"或"万"情况,临时变量值*"百"单位值进list等待处理
    if (isExist) {
    mulitNumList.add(tempNum * unitMap.get(bit + ""));
    tempNum = 0;
    }
    // 不存在"亿"或"万"情况,临时变量值put到map相应位
    else {
    dataMap.put("百", tempNum);
    tempNum = 0;
    }
    } else if (bit == '十') {
    // 存在"亿"或"万"情况,临时变量值*"十"单位值进list等待处理
    if (isExist) {
    if (tempNum != 0) {
    mulitNumList.add(tempNum * unitMap.get(bit + ""));
    tempNum = 0;
    }
    // 将"十"转换成"一十"
    else {
    tempNum = 1 * unitMap.get(bit + "");
    }
    }
    // 不存在"亿"或"万"情况,临时变量值put到map相应位
    else {
    if (tempNum != 0) {
    dataMap.put("十", tempNum);
    }
    // 将"十"转换成"一十"
    else {
    dataMap.put("十", 1l);
    }
    tempNum = 0;
    }
    }
    } // output
    System.out.println();
    long sum = 0;
    java.util.Set<String> keys = dataMap.keySet();
    for (String key : keys) {
    Integer unitValue = unitMap.get(key);
    Long dataValue = dataMap.get(key);
    sum += unitValue * dataValue;
    }
    System.out.println(sum);
    }一
    1

    10
    一十五
    15
    十五
    15
    二十
    20
    二十三
    23
    一百
    100
    一百零一
    101
    一百一十
    110
    一百一十一
    111
    一千
    1000
    一千零一
    1001
    一千零三十一
    1031
    一万零一
    10001
    一万零二十一
    10021
    一万零三百二十一
    10321
    一万一千三百二十一
    11321
    三千零十五万
    30150000
    三千零一十五亿
    301500000000
    三千五百六十八万零一百零一
    35680101
    五十亿三千零七十五万零六百二十二
    5030750622
    十三亿三千零十五万零三百一十二
    1330150312
    三千零七十八亿三千零十五万零三百一十二
    307830150312
    一千二百五十八亿
    125800000000
    二十一亿三千万
    2130000000
    一亿三千万
    130000000
    一亿零三千万
    130000000
    一千二百五十八万亿零三千三百二十一
    1258000000003321