• A1082 Read Number in Chinese [汉字读数字]


    在这里插入图片描述
    ———————————————————————————
    这是简单模拟中最难的一道题,我也是想了很久,这题放考场上我肯定是做不出的,最后算是看懂了,然后把思路说一下,感觉网上思路都没有说的很清楚。
    思路 :

    1. 首先它是分字节来处理,这里的字节不是计算机中的byte,而是数字的字节,4位后是万,在4位是亿,然后从右到左每4个节处理一次,高位不足4位的就直接处理。
    2. 每个节内处理就是非零的数就读出相应的数字和位数,当做一个4位数字来读。
    3. 每读完4位数字要看这个数字是否大于5位,大于5位就最后还要读出相应的万或者亿。
    4. 如果有连续的0出现在非零数字之间,如100001注意只要读出一个ling。
    #include<iostream>
    #include<string>
    using namespace std;
    string num[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
    string wei[5] = { "Shi","Bai","Qian","Wan","Yi" };
    int main()
    {
    	string s;
    	getline(cin, s);
    	int length = s.length();
    	int left = 0, right = length - 1;
    	if (s[0] == '-')
    	{
    		cout << "Fu";
    		left++;
    	}
    	while (left + 4 <= right)           //从右到左每四位为一节,按节处理,多余的直接处理
    		right -= 4;
    	while (left < length)
    	{
    		bool flag = false;   //表示没有累计的0
    		bool isprint = false;  //表示该节没有输出过其中的位(如果是个位,不用输出后面的位数)
    		while (left <= right)
    		{
    			if (left > 0 && s[left] == '0') //如果当前位为0
    			{
    				flag = true;
    			}
    			else //如果当前位不为0
    			{
    				if (flag == true) //存在多个累计的0 只输出一遍ling就行
    				{
    					cout << " ling";
    					flag = false;
    				}
    				if (left > 0)
    					cout << " ";
    				cout << num[s[left] - '0'];
    				isprint = true;
    				if (left != right)  //某个节中除了个位外,都需要输出十百千
    				{
    					cout << " "<<wei[right - left - 1];
    				}
    			}
    			left++;
    		}
    		if (isprint && right != length - 1)     //只要不是个位,输出万和亿
    		{
    			cout << " "<<wei[(length - 1 - right) / 4 + 2]; //存在一个节 输出万 存在两个节 输出亿不会超过9个数
    		}
    		right += 4;
    	}
    	return 0;
    }
    
  • 相关阅读:
    CSS3 animation 属性
    关于shortcut icon和icon代码的区别介绍
    用js判断一个复选框是否被选中
    今天开始,走不一样的路
    JavaScript 中的对象
    (已转)Linux基础第七章 线程
    (已转)C++知识图谱
    Linux基础 文件和目录
    (已转)Linux基础第六章 信号
    Linux第四章 进程
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13812086.html
Copyright © 2020-2023  润新知