数的读法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljt735029684/article/details/81159241

python看累了,去看了下以前自己写的C++算法代码,感觉写得复杂了,所以改进了下思路。顺便做一次记录。

数的读法这题,难度不是很大,但是考虑的情况较多,以前写的很费时间。这次想写得短一些

/* 
	题目;输入数字,打印它的中文读音
	
	0要做特殊处理,因为0读出来不会加位数。且多个0连续时只读一次
	1要做特殊处理,遇到十时,不读。十亿。不是一十亿, 
	位数的特殊情况:全为0时可以不读,如1亿,不全为0时一定要读,如1亿1千万 
	
	如果位数不够过标志位的4位,就用剩余位数
*/
#include<iostream>
#include<string>
#include<algorithm>

using namespace std; 

int main()
{
	string digits[10] = {"", "shi", "bai", "qian", "wan", "shi", "bai", "qian", "yi", "shi"};
	string number[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
	
	string str;
	cin >> str;
	
	int len = str.length();
	for(int i = 0; i < len; i++)
	{
		int num = str[i] - '0';//得到相应的数字
		int nowdig = len - i - 1;	//倒序,得到正确的位数下标 
		  
		//0要做特殊处理,
		if(num == 0)
		{	
			//处理方式:连续几个0时只读最后一个0的读音。
			 //处理0的数问题。如果有下一个数, 且下一个数不是0 
			if(i + 1 < len && str[i + 1] != '0')
				cout << number[num] << " ";
				
			//处理0的位问题: 
			if((nowdig) % 4 == 0)	 //当为个,万, 亿位时,为标志位 
			{
				//如果标志位前面够4位,就取4位,否则取到最高位,由于是左闭右开,所以如果位数不够4时,应为i+1,才能取到i
				int count = min(i+1, 4);
				
				bool allzero = true;	//标志着是否全为0 
				for(int j = 0; j < count ; j++)
				{
					if(str[i - j] != '0')
					{
						allzero = false;
						break;	
					}  
					
				}
				
				if(allzero)
					continue;	
				else
					cout << digits[nowdig] << " ";
				
				
			}
		}
		//在每到需要读1的时候,遇到shi就不读 
		else if(num == 1 && (nowdig == 1 || nowdig == 5 || nowdig == 9))
		{
			cout << digits[nowdig] << " ";
		}
		else
		{	
			cout << number[num] << " " << digits[nowdig] << " ";				
		}
		
	}	
	
	cout << endl;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ljt735029684/article/details/81159241
今日推荐