也是笔试题,题目要求为:

    实现数字到大写的转换,如输入120.000078,转换后为"壹佰贰拾点零零零零柒捌".

    分析:

    可以直接将输入用字符串获取,因为即使是double型也精度有限,可能会违背用户的本意。然后得到小数点位置将变量dot置为对应下标,如果没有小数点则将其置为字符串长度大小,再分小数点前和小数点后处理。

    小数点后:直接将数字转换为对应的大写即可。

    小数点前:需要考虑的问题要多一些。如果小数点前连续几位都为零,则不将这些零都转换过来,但是如果这些连续的零中有的在“万”或者“万万”等位,则需要给其加权。不为零的位除了个位外其它的都要加权,如“佰仟拾”等。

    具体实现如下:

​#include
#include ​

​std::string ctoC(char c)
{
    std::string res = "";
    switch(c)
    {
        case ‘0′: res = "零"; break;
        case ‘1′: res = "壹"; break;
        case ‘2′: res = "贰"; break;
        case ‘3′: res = "叁"; break;
        case ‘4′: res = "肆"; break;
        case ‘5′: res = "伍"; break;
        case ‘6′: res = "陆"; break;
        case ‘7′: res = "柒"; break;
        case ‘8′: res = "捌"; break;
        case ‘9′: res = "玖"; break;
        case ‘.’: res = "点"; break;
        default: break;
    }
    return res;
}​

​std::string addRight(int n)    // 添加权标记
{
    std::string res = "";
    switch(n)
    {
        case 1: res = "萬"; break;
        case 2: res = "拾"; break;
        case 3: res = "佰"; break;
        case 0: res = "仟"; break;
        default: break;
    }
    return res;
}​

​void Change(std::string strVal)
{
    std::string::size_type dot = strVal.size();    // 设置小数点位置
    if ((std::string::size_type)(-1) != strVal.find(’.', 0))
        dot = strVal.find(’.', 0);
    std::string res = "";
    std::string resTmp = "";
    std::string::size_type notZero,tmpNotZero;
    for (std::string::size_type k=dot-1; k>=0; –k)   // 找到小数点前第一个不为零的
    {
        if(strVal[k] != ‘0′){notZero = k; break;}
    }
    for (std::string::size_type i=0; i<=notZero; ++i)  // 从最高位到小数点前第一个不为0的
    {
        // 如果非零 或者 是零但不是万所在个位且下一位不是零
        if ((’0′ != strVal[i]) ||
            (’0′== strVal[i] && (dot-i)%4 != 1 && (i+1)<=notZero && (strVal[i+1] != ‘0′)))
            res += ctoC(strVal[i]);
        // 如果是小数点前第一位则不加权
        if ((dot-i)==1)
            continue;
        // 如果非零 或者 是零但是万所在位
        if (’0′ != strVal[i] || (’0′ == strVal[i] && (dot-i)%4 == 1))
            res += addRight((dot-i)%4);
    }
    tmpNotZero = (dot-notZero)/4;
    while(tmpNotZero >0)    // 为小数点前的多零加权如果有必要
    {
        res += addRight(1);
        tmpNotZero–;
    }
    for (std::string::size_type j=dot; j     {
        res += ctoC(strVal[j]);
    }
    std::cout << res << std::endl;
}​

​int main()
{
    std::string num;
    while(true)
    {
        std::cout << "Please Input your num: ";
        std::cin >> num;
        Change(num);
    }​

​    return 0;
}

    功能基本实现,最大单位为万,如 111111010 被翻译成 壹萬壹仟壹佰壹拾壹萬壹仟零壹拾