• 基础练习 数的读法


    问题描述
      Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。
      比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。
      所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法:
      十二亿三千四百五十六万七千零九
      用汉语拼音表示为
      shi er yi san qian si bai wu shi liu wan qi qian ling jiu
      这样他只需要照着念就可以了。
      你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
      注意必须严格按照规范,比如说“10010”读作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。
    输入格式
      有一个数字串,数值大小不超过2,000,000,000。
    输出格式
      是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
    样例输入
    1234567009
    样例输出
    shi er yi san qian si bai wu shi liu wan qi qian ling jiu
     
    写了半天的菜鸡做法,建议看下面大佬做法
      1 #include<iostream>
      2 #include<string>
      3 #include<cstring>
      4 using namespace std;
      5 
      6 string pinyin[11] ={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
      7 
      8 string fun2(string str)  //两位数读法 
      9 {
     10     int len = str.length();
     11     string s = "";
     12     if(str[1] == '0')
     13         {
     14             if(str[0] == '1')   //10 ---- shi
     15             s = "shi";
     16             else     // 20,30,40
     17             s = s + (pinyin[str[0] - '0']) + " shi";
     18         }
     19         else
     20         {
     21         if(str[0] == '1')
     22         {
     23             s = "shi " + (pinyin[str[1] - '0']);
     24         }
     25         else
     26         {
     27             s = pinyin[str[0] - '0'] + " shi " + pinyin[str[1] - '0'];
     28         }
     29         }
     30         return s;
     31 }
     32 
     33 string fun3(string str)  //三位数读法 
     34 {
     35     int len = str.length();
     36     string s = "";
     37     if(str[1] == '0' && str[2] == '0' && str[0] != '0')
     38         {
     39             s = pinyin[str[0] - '0'] + " bai";
     40         }
     41         else if(str[0] != '0' && str[1] != '0' && str[2] == '0')
     42         {
     43             s = pinyin[str[0] - '0'] + " bai " + pinyin[str[1] - '0'] + " shi";
     44         }
     45         else if(str[0] != '0' && str[1] == '0' && str[2] != '0')
     46         {
     47             s = pinyin[str[0] - '0'] + " bai " + pinyin[str[2] - '0'];
     48         }
     49         else
     50         {
     51             s = pinyin[str[0] - '0'] + " bai " + pinyin[str[1] - '0'] + " shi " + pinyin[str[2] - '0'];
     52         }
     53         return s;
     54 }
     55 
     56 string fun4(string str)
     57 {
     58     int len = str.length();
     59     string s = "";
     60     if(len == 1)
     61     {
     62         s = pinyin[str[0] - '0'];
     63     }
     64     else if(len == 2)
     65     {
     66         s = fun2(str);
     67     }
     68     else if(len == 3)  //三位数 
     69     {
     70         s= fun3(str);
     71     }
     72     else  //四位数 
     73     {
     74         if(str[0] != '0' && str[1] == '0' && str[2] == '0' && str[3] == '0')
     75         {
     76             s = pinyin[str[0] - '0'] + " qian";
     77         }
     78         else if(str[0] != '0' && str[1] == '0' && str[2] == '0' && str[3] != '0')
     79         {
     80             s = pinyin[str[0] - '0'] + " qian ling " + pinyin[str[3] - '0'];
     81         }
     82         else if(str[0] != '0' && str[1] == '0' && str[2] == '1' && str[3] == '0')
     83         {
     84             s = pinyin[str[0] - '0'] + " qian ling yi shi";
     85         }
     86         else if(str[0] != '0' && str[1] == '0' && str[2] == '1' && str[3] != '0')
     87         {
     88             s = pinyin[str[0] - '0'] + " qian ling yi shi " + pinyin[str[3] - '0'];
     89         }
     90         else if(str[0] != '0' && str[1] == '0' && str[2] != '0' && str[2] != '1' && str[3] != '0')
     91         {
     92             string ss = "";
     93             ss = ss + str[2] + str[3]; 
     94             s = pinyin[str[0] - '0'] + " qian " + fun2(ss);
     95         }
     96         else
     97         {
     98             string sss = "";
     99             sss = sss + str[1] + str[2] + str[3];
    100             s = pinyin[str[0] - '0'] + " qian " + fun3(sss);
    101         }
    102     }
    103     return  s;
    104 }
    105 
    106 string quling(int x,int y,string str)  //去掉前导零
    107 {
    108     string s = "";
    109     int i = x;
    110     while(str[i] == '0')
    111     i++;
    112     for(int j = i; j <= y;j++)
    113     s += str[j];
    114     return s;
    115  } 
    116  
    117  void wanji(int l,string str)
    118  {
    119      string s1 = "",s2 = "";
    120              s1 = quling(l - 4,l - 1,str);
    121              s2 = quling(0,l - 5,str);
    122              //cout << "s1 = " << s1 << endl;
    123              //cout << "s2 = " << s2 << endl;
    124              if(s1.length() == 0)
    125              {
    126                  cout << fun4(s2) << " wan" << endl; 
    127              }
    128              else if(s1.length() > 0 && s1.length() < 4)
    129              {
    130                  cout << fun4(s2) << " wan ling " << fun4(s1) << endl;
    131              }
    132              else
    133              {
    134                  cout << fun4(s2) << " wan " << fun4(s1) << endl;
    135              }
    136  }
    137 
    138 int main()
    139 {
    140     
    141     string str;
    142     while(cin >> str)
    143     {
    144         //从低位到高位每四位一个数 + 数量级
    145          int len = str.length();  //数字长度
    146          int n = len / 4 + 1;  //几段 
    147          if(len > 8)
    148          {
    149              string s1 = "",s2 = "",s3 = "";
    150              s1 = quling(len - 4,len - 1,str);
    151              s2 = quling(len - 8,len - 5,str);
    152              s3 = quling(0,len - 9,str);
    153              cout << fun4(s3) << " yi ";
    154              if(s2.length() == 0)
    155              cout << "ling wan ";
    156              else if(s2.length() > 0 && s2.length() < 4)
    157              cout << "ling " << fun4(s2) << " wan ";
    158              else
    159              cout << fun4(s2) << " wan ";
    160              
    161              if(s1.length() > 0 && s1.length() < 4)
    162              cout << " ling " << fun4(s1) << endl;
    163              else if(s1.length() == 4)
    164              cout << fun4(s1) << endl;
    165          }
    166          else if(len > 4 && len < 9)  //万级 
    167          {
    168              
    169              wanji(len,str);
    170          /*    string s1 = "",s2 = "";
    171              s1 = quling(len - 4,len - 1,str);
    172              s2 = quling(0,len - 5,str);
    173              //cout << "s1 = " << s1 << endl;
    174              //cout << "s2 = " << s2 << endl;
    175              if(s1.length() == 0)
    176              {
    177                  cout << fun4(s2) << " wan" << endl; 
    178              }
    179              else if(s1.length() > 0 && s1.length() < 4)
    180              {
    181                  cout << fun4(s2) << " wan ling " << fun4(s1) << endl;
    182              }
    183              else
    184              {
    185                  cout << fun4(s2) << " wan " << fun4(s1) << endl;
    186              }*/
    187          }
    188          else  //小于等于四位数 
    189          {
    190              cout << fun4(str) << endl;
    191          }
    192      } 
    193     return 0;
    194 }
      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 string num[11]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu","shi"}; 
      4 string big[3]={"shi","bai","qian"};
      5 string bb[2]={"wan","yi"};
      6 string change(string a,int m,int Max)
      7 {
      8     string str="";
      9     int w=-1;
     10     int n=0,i,le=a.length();
     11     bool use=false;
     12     for(i=0;i<le;i++)
     13     n=n*10+(a[i]-48);
     14     if(n==0&&m==1)
     15     return "";
     16     if(n/1000>0)
     17     {
     18         str+=num[n/1000];
     19         str+=' ';
     20         str+=big[2];
     21         str+=' ';
     22         n=n-n/1000*1000;
     23         w=2;
     24     }
     25     if(w!=2&&m<Max&&!use)
     26     {
     27         str+="ling ";
     28         use=true;
     29     }
     30     if(n/100>0)
     31     {
     32         str+=num[n/100];
     33         str+=' ';
     34         str+=big[1];
     35         str+=' ';
     36         n=n-n/100*100;
     37         w=1;
     38         use=false;
     39     }
     40     if(w!=1&&!use&&m<Max)
     41     {
     42         
     43         str+="ling ";
     44         use=true;
     45     }
     46     if(n/10>0)
     47     {
     48         if(w!=1&&n/10==1&&m!=1)
     49         {
     50             str+=big[0];
     51             str+=' ';
     52             n=n-n/10*10;
     53             w=0;
     54         }
     55         else
     56         {
     57             str+=num[n/10];
     58             str+=' ';
     59             str+=big[0];
     60             str+=' ';
     61             n=n-n/10*10;
     62             w=0;
     63         }
     64     }
     65     if(n!=0)
     66     {
     67         str+=num[n];
     68         str+=' ';
     69     }
     70     if(m>1)
     71     {
     72         str+=bb[m-2];
     73         str+=' ';
     74     }
     75     return str;
     76 }
     77 int main()
     78 {
     79     string str,ed="";
     80     int m,n,t,star=0;
     81     cin>>str;
     82     int len=str.length();
     83     t=m=len/4+1;
     84     n=len%4;
     85     if(n==0)
     86     t=m=m-1;
     87     while(t)
     88     {
     89         if(t==m)
     90         {
     91             if(n!=0)
     92             {
     93                 ed+=change(str.substr(star,n),t,m);
     94                 star+=n;
     95             }
     96             else
     97             {
     98                 ed+=change(str.substr(star,4),t,m);
     99                 star+=4;
    100             }
    101             
    102             
    103         }
    104         else
    105         {
    106             ed+=change(str.substr(star,4),t,m);
    107             star+=4;
    108         }
    109         t--;
    110     }
    111     cout<<ed<<endl;
    112     return 0;
    113 }
  • 相关阅读:
    (1)李宏毅深度学习-----机器学习简介
    Git命令之不得不知的git stash暂存命令
    Http2升级方案调研
    神奇的 SQL 之别样的写法 → 行行比较
    熔断机制
    限流算法
    状态机
    布隆过滤器
    负载均衡算法
    K8S Ingress
  • 原文地址:https://www.cnblogs.com/wlyperfect/p/12626391.html
Copyright © 2020-2023  润新知