也是笔试题,题目要求为:
实现数字到大写的转换,如输入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 被翻译成 壹萬壹仟壹佰壹拾壹萬壹仟零壹拾