逻辑:
1、将每串数字每四位分为一块(中文习惯喜欢四位四位读)
2、将这四位填充千百十个
3、按照当前的位置,填充万,十万等单位
4、拼接
比较麻烦的是按照习惯填充零的那部分
版本
#include <iostream>
#include <string>
const std::string NumberChs[10] = { "零","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
const std::string UnitChs[3] = { "拾","佰","仟"};
const std::string UnitChs_2[4] = { "萬", "亿", "萬亿","兆"};
#define GetNumChs(a) ((a<_countof(NumberChs))?NumberChs[a]:"")
#define GetUnitChs(a) ((a<_countof(UnitChs))?UnitChs[a]:"")
#define GetUnitChs2(a) ((a<_countof(UnitChs_2))?UnitChs_2[a]:"")
std::string ValueToChs(unsigned long long value, int & last_num)
{
int value_length = 4; //每次都计算四位,防止类似10001却只计算了1导致零没填充
std::string _denom_chs;
unsigned long long _value = value;
int _last_num_tmp = last_num==-1?-1:1;//不继承上一部分的最后一位
while (value_length != 0)
{
value_length = value_length - 1;
int pow_value = pow((float)10, value_length); // 取最高位
unsigned long long num = _value / pow_value;
_value = _value % pow_value; //去掉最高位,用于逐位转换
std::string _num_chs = GetNumChs(num);
if (num == 0)
{
if (_last_num_tmp != -1) //当不是-1即不是开头的时候才去更新_last_num
_last_num_tmp = num;
continue;
}
_num_chs = _num_chs + GetUnitChs(value_length - 1);
if (_last_num_tmp == 0 && num != 0) //当前位不为0并且前面为0,表示需要填充0
{
_last_num_tmp = num;
_denom_chs = _denom_chs + GetNumChs(0) + _num_chs;
continue;
}
_last_num_tmp = num;
_denom_chs = _denom_chs + _num_chs;
}
last_num = _last_num_tmp; //更新last_num为最后一位的值
return _denom_chs;
}
std::string DenomValueToChs(unsigned long long value)
{
int unit = (std::to_string(value).length() - 1) / 4; //整串数字 每四位 分一块
unsigned long long _value = value;
std::string _denom_chs;
int last_num = -1; //必须初始化为负数,否则会判断为有效位故在前面加零
while (_value != 0)
{
unsigned long long _pow_value = pow((float)10000, unit--);
unsigned long long tmp_value = _value / _pow_value;
if (tmp_value <= 0){
last_num = 0;
continue;
}
_denom_chs = _denom_chs + ValueToChs(tmp_value, last_num) + GetUnitChs2(unit);
_value = _value %_pow_value; // 去掉已经计算过的位数
}
return _denom_chs;
}
int main()
{
unsigned long long value = 0;
while (true){
std::cin >> value;
std::cout << "输入:" << value << std::endl;
std::cout << "转换后:" << DenomValueToChs(value) << std::endl;;
}
//ValueToChs(1124);
}
版本二 (改了一下参数)
#include <iostream>
#include <string>
const std::string NumberChs[10] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
const std::string UnitChs[3] = { "拾", "佰", "仟" };
const std::string UnitChs_2[4] = { "萬", "亿", "萬亿", "兆" };
#define GetNumChs(a) ((a<_countof(NumberChs))?NumberChs[a]:"")
#define GetUnitChs(a) ((a<_countof(UnitChs))?UnitChs[a]:"")
#define GetUnitChs2(a) ((a<_countof(UnitChs_2))?UnitChs_2[a]:"")
std::string ValueToChs(unsigned long long value, bool is_begin )
{
int value_length = 4; //每次都计算四位,防止类似10001却只计算了1导致零没填充
std::string _denom_chs;
unsigned long long _value = value;
int _last_num_tmp = -1;
while (value_length != 0)
{
value_length = value_length - 1;
int pow_value = pow((float)10, value_length); // 取最高位
unsigned long long num = _value / pow_value;
_value = _value % pow_value; //去掉最高位,用于逐位转换
std::string _num_chs = GetNumChs(num);
if (num == 0)
{
if (!is_begin) //当不是整串字符串开头的时候会更新last_num_tmp
_last_num_tmp = num;
continue;
}
_num_chs = _num_chs + GetUnitChs(value_length - 1);
if (!is_begin && (_last_num_tmp == 0 && num != 0)) //当前位不为0并且前面为0,表示需要填充0
{
_last_num_tmp = num;
_denom_chs = _denom_chs + GetNumChs(0) + _num_chs;
continue;
}
_last_num_tmp = num;
_denom_chs = _denom_chs + _num_chs;
}
return _denom_chs;
}
std::string DenomValueToChs(unsigned long long value)
{
int unit = (std::to_string(value).length() - 1) / 4; //整串数字 每四位 分一块
unsigned long long _value = value;
std::string _denom_chs;
bool is_begin = true;
while (_value != 0)
{
unsigned long long _pow_value = pow((float)10000, unit--);
unsigned long long tmp_value = _value / _pow_value;
if (tmp_value <= 0){
continue;
}
_denom_chs = _denom_chs + ValueToChs(tmp_value, is_begin) + GetUnitChs2(unit);
_value = _value %_pow_value; // 去掉已经计算过的位数
is_begin = false;
}
return _denom_chs;
}
int main()
{
unsigned long long value = 0;
while (true){
std::cin >> value;
std::cout << "输入:" << value << std::endl;
std::cout << "转换后:" << DenomValueToChs(value) << std::endl;;
}
//ValueToChs(1124);
}