zoukankan      html  css  js  c++  java
  • 1082 Read Number in Chinese (25 分)

    1. 题目

    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
    

    2. 题意

    给定一个不超过9位的整数,转化为用中文形式读出。例:123,中文读法为一百二十三,输出结果为yi Bai er Shi san;再如:-100800,中文读法为负一十万零八百,输出结果为Fu yi Shi Wan ling ba Bai

    3. 思路

    1. 定义一个结果字符串res
    2. 如果输入整数为负数,则将Fu 加入到结果字符串中。
    3. 通过除10取余法取出整数的 每一位。
    4. 从整数高位开始遍历整数的每一位:如果有连续零出现,那么只有在当前位不为0,当前位的高一位为0时,才将ling加入结果字符串,其余时候ling均不加入结果字符串;当当前位不为0时,只要按照位数位置,将该位数字中文形式和该位置的念法加入结果字符串即可。

    4. 代码

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    // digit to string
    string dtos(int digit)
    {
    	switch (digit)
    	{
    		case 1: return "yi";
    		case 2: return "er";
    		case 3: return "san";
    		case 4: return "si";
    		case 5: return "wu";
    		case 6: return "liu";
    		case 7: return "qi";
    		case 8: return "ba";
    		case 9: return "jiu";
    		case 0: return "ling";
    	}
    	return "";
    }
    
    // shi bai qian to string 十百千转中文字符串 
    string ctos(int cnt)
    {
    	switch (cnt)
    	{
    		case 1: return " Shi";
    		case 2: return " Bai";
    		case 3: return " Qian";
    	}
    	return "";
    }
    
    int main()
    {
    	int n;
    	cin >> n;
    	if (n < 0)
    	{
    		cout << "Fu ";
    		n = -n;
    	}
    	vector<int> digits;
    	// 除10取余法,取出给定整数的每一位 
    	while (n)
    	{
    		int t = n % 10;
    		digits.push_back(t);
    		n /= 10;
    	}
    	int len = digits.size();
    	if (len == 0) 
    	{
    		cout << "ling" << endl;
    		return 0;
    	}
    	// 将最高位中文形式和“十百千”之一加入结果字符串 
    	string res = dtos(digits[len - 1]) + ctos((len - 1) % 4);
    	// 如果刚好最高为处于 万 或 亿 交界处,则将 万 或 亿 加入结果字符串 
    	if (len - 1 == 4) res += " Wan";
    	else if (len - 1 == 8) res += " Yi";
    	// 从数字高位开始转化 
    	for (int i = len - 2; i >= 0; --i)
    	{
    		// 如果当前位不为0,高位为0,将ling加入结果字符串 
    		if (digits[i] != 0 && digits[i + 1] == 0) res += " " + dtos(0);
    		// 如果当前位不为0,则将当前位中文形式和“十百千”之一加入结果字符串 
    		if (digits[i] != 0) res += " " + dtos(digits[i]) + ctos(i % 4);
    		// 当遍历到万和亿交界处时,将万或亿加入字符串 
    		if (i == 4) res += " Wan";
    		else if (i == 8) res += " Yi";
    	}
    	cout << res << endl;
    	return 0;
    }
     
    

  • 相关阅读:
    css 控制溢出文本显示省略号效果
    限制input 文本框复制粘贴
    charCodeAt()方法
    背景全透明 background: transparent
    jQuery 双击事件(dblclick)时,不触发单击事件(click)
    html textarea(文本域)自动换行
    input 文本框无法输入 有光标
    双击鼠标滚动屏幕的代码
    ABP 日志审计 返回值开启 循环引用序列化异常 Self referencing loop detected
    浏览器相关知识点一(前端面试准备)
  • 原文地址:https://www.cnblogs.com/vanishzeng/p/15484720.html
Copyright © 2011-2022 走看看