1082 Read Number in Chinese

1082 Read Number in Chinese

题意描述

给一个不超过9位的数 要求输出 数在传统中文的读法

输入输出格式

输入即为一个不超过9位的十进制整数 可正可负 输出它的中文读法 两个单词之间用空格隔开

数据规模

数最多有9位

算法设计

首先 确定一个方向 我们要处理 ling的添加 数字和中文的对应 以及数字对应的权重的中文

  1. 我们可以先将数字逆序 从个位开始枚举 ,若这位数字不为0,我们将其对应的中文添加至结果向量res
  2. 我们设立两个表 第一个表是数字中文进行转换 ,第二个表是数字的进制单位转换 比如 当枚举到5005时 我们应当添加 wu bai 至结果向量中
  3. ling的处理。 添加ling的原因是 数字在某一位上的取值为 0 比如 千位 百位 比如 1050 读作 yi Qian ling wu Shi 就是因为在百位上 1050 的值为0
  4. 但这里要注意 两个 ling不能重叠 即 这个数可能千位为0,百位也为0,显然只要加一个ling即可。
  5. 这个数 可能万位为0,比如500000 但是 它读作五十万 它有 这个单位的,所以我们可以单独拿出来判断一下,即 如果这个数万位为0,但只要十万位,百万位,千万位 有一个不为0 我们就应该在枚举到这位时添加一个wan
  6. 同时 为了避免出现 ling wan 我们也需要判定 wan的前面没有ling
  7. 最后 注意边界 即数字为0 输出就是ling
  8. res逆序 控制格式输出即可

c++代码

#include <bits/stdc++.h>
using namespace std;
using gg = long long;
string biao1[]{"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string biao2[]{"Ge","Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi"};
int main()
{
   ios::sync_with_stdio(false);
   cin.tie(0);
   string stri;
   cin>>stri;
   if(stri[0] == '-') {
      cout<<"Fu ";
      stri = stri.substr(1);
   }
   vector<string>res;
   reverse(stri.begin(),stri.end());
   gg len = stri.size();
   bool flag = false;
   for(gg i=0;i<len;i++){
      if((i == 5 or i==6 or i== 7) and stri[i] !='0') {
         flag = true;
         break;
      }
   }
   for(gg i=0;i<len;i++){
      if(i == 4 and (stri[i] == '0') and flag) res.push_back("Wan");
      if(i ==0 and (stri[i] != '0')) res.push_back(biao1[stri[i]-'0']);
      else if(i>0 and (stri[i] =='0') and res.size() and (res.back() != "ling") and (res.back() != "Wan")) res.push_back("ling"); 
      else if(i>0 and (stri[i] != '0')) res.push_back(biao1[stri[i]-'0']+" "+biao2[i]);
   }
   reverse(res.begin(),res.end());
   len = res.size();
   for(gg i=0;i<len;i++){
      if(i) cout<<" ";
      cout<<res[i];
   }
   if(stri == "0") cout<<"ling";   // '真'数据边界...
   return 0;
}

题目链接

上一篇:函数传参 数组


下一篇:删除字符串中的字符