zoukankan      html  css  js  c++  java
  • PTA (Advanced Level)1082.Read Number in Chinese

    Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output Fu first if it is negative. For example, -123456789 is read as Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu. Note: zero (ling) must be handled correctly according to the Chinese tradition. For example, 100800 is yi Shi Wan ling ba Bai.

    Input Specification:

    Each input file contains one test case, which gives an integer with no more than 9 digits.

    Output Specification:

    For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.

    Sample Input 1:
    -123456789
    
    Sample Output 1:
    Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
    
    Sample Input 2:
    100800
    
    Sample Output 2:
    yi Shi Wan ling ba Bai
    
    思路
    • 对应位置输出对应的百十千这很好想到,分段处理也很好想到,但是夹在两个数字之间的0要怎么控制输出想了很久都没有答案,看了《算法笔记上机训练实战指南》后恍然大悟,代码基本是书上的代码
    • 可以借鉴的地方:
      • 分段的巧妙之处,每次r -= 4定位到第一段随后只要r+4就到另一段了,比我本来用的%, /分割字符串好多了
      • 800000008的输出应该是ba Yi ling ba而不是ba Yi Wan ling ba,也就是中间的段如果全为0就不能输出多余的万
    代码
    #include<bits/stdc++.h>
    using namespace std;
    char number[15][6] = {"ling", "yi", "er", "san", "si",
    				 "wu", "liu", "qi", "ba", "jiu"};
    char q[5][5] = {"Shi", "Bai", "Qian", "Wan", "Yi"};
    
    
    int main()
    {
    	string s;
    	cin >> s;
    	int l = 0, r = s.size() - 1;
    	if(s[0] == '-')
    	{
    		cout << "Fu";
    		l++;
    	} //负数输出"Fu",l定位到第一个位
    	while(l + 4 <= r)	r -= 4;			//数字分成a,b,c三段,先定位到最高的一段
    	while(l < s.size())
    	{
    		bool acum0 = false;		//累加0
    		bool printed = false;	//是否有输出过
    		while(l <= r)
    		{
    			if(l > 0 && s[l] == '0')	acum0 = true;   
    			else
    			{ //当前位不为0
    				if(acum0)    //存在累计的0
    				{
    					cout << " ling";
    					acum0 = false;
    				}
    				if(l > 0)	cout << " ";    //非首位的话后面都要输出空格
    				cout << number[s[l] - '0'];    //输出对应数字
    				printed = true;    // >=1的数字被输出
    				if(l != r)  //因为r始终在每一段的最后一位,如果不相等说明不是各位,那么就要输出对应的百十千
    					cout << " " << q[r - l - 1];
    			}
    			l++;    //处理完当前位,进行下一位
    		}
    		if(printed && r != s.size() - 1)   //非个位就输出万或亿
    			cout << " " << q[(s.size() - 1 - r) / 4 + 2];
    		r += 4;
    	}
    
    	return 0;
    }
    
    
    
    引用

    https://pintia.cn/problem-sets/994805342720868352/problems/994805385053978624

  • 相关阅读:
    Nubiers to follow
    pp to write
    Reading source code
    build opencv with python support
    add monitor resolution
    Install cv2.so for Anaconda
    axios 上传下载显示进度
    vant 上传图片 图片回显 是base64
    多个时间段 合并
    热部署
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/11731187.html
Copyright © 2011-2022 走看看