汉字和阿拉伯数字的相互转换

阿拉伯数字到汉字:

把阿拉伯数组四个一组取出来,逐位向汉字转,在组内,数字转为汉字+权位。然后每个组间,添加权节位 和 0
1.只有当101这种形式,组内才需要添加“零”
2.多个连续的0只加一个“零”
上面两点用一个标记位可以实现,记录当前字符的上一个字符是不是0,只有当上一个字符不是0,且左侧还有非零(101形式),加一个“零”,因为连续的0会导致上一个字符为0,不会重复添加。

3.当本节小于一千(即最高位为0),且下一节不为0时,需要在节间添加0.

#include<vector> 
#include<iostream> 
#include<algorithm> 
using namespace std; 
string chnNumChar[] = { "零","一","二","三","四","五","六","七","八","九" }; 
string chnUnitSection[] = { "","万","亿","万亿" }; 
string chnUnitChar[] = { "","十","百","千" }; 
//num == 0需要特殊处理,直接返回"零" 
void SectionToChinese(unsigned int section, std::string& chnStr) 
{ 
    std::string strIns; 
    int unitPos = 0; 
    bool zero = true; 
  //  cout << section << endl; 
    while (section > 0) 
    { 
        int v = section % 10; 
        if (v == 0) 
        { 
            if ((section != 0) &&  !zero) 
            { 
               // cout << section << " " << zero << endl; 
                zero = true; /*需要补,zero的作用是确保对连续的多个,只补一个中文零*/ 
                chnStr = chnNumChar[v] + chnStr; 
            } 
        } 
        else 
        { 
            zero = false; //至少有一个数字不是 
            if (section != 1 || unitPos!=1) 
            	strIns = chnNumChar[v]; //此位对应的中文数字 
           // cout << unitPos << endl; 
            strIns += chnUnitChar[unitPos]; //此位对应的中文权位 
            chnStr  = strIns + chnStr; 
        } 
        strIns = ""; 
        unitPos++; //移位 
        section = section / 10; 
    } 
} 

void NumberToChinese(unsigned int num, std::string& chnStr) 
{ 
    int unitPos = 0; 
    std::string strIns; 
    bool needZero = false; 
    while (num > 0) 
    { 
        unsigned int section = num % 10000; 
        if (needZero) 
        { 
            chnStr.insert(0, chnNumChar[0]); 
        }
        SectionToChinese(section, strIns); 

        /*是否需要节权位? */ 
        strIns += (section != 0) ? chnUnitSection[unitPos] : chnUnitSection[0]; 
        chnStr = strIns + chnStr; 

        /*千位是0需要在下一个section补零*/ 
        needZero = (section < 1000) && (section > 0); 
        strIns = ""; 
        num = num / 10000; 
        unitPos++; 
    } 
} 

int main() 
{ 
	int num; 
    while (cin >> num) 
    { 
        string ret; 
        NumberToChinese(num, ret); 
        cout << ret << endl; 
    } 
	return 0;
} 

汉字到阿拉伯数字:

中文数字转阿拉伯数字(C++实现)

逐个汉字 向数字转。遇到汉字,转为数字,遇到“零”,跳过,遇到权位,将数字乘权位,暂存到节值里,遇到节权位,累加到最终结果。

#include<vector>  
#include<iostream> 
#include<algorithm>  
#include<string> 
#include<unordered_map> 
#define CHN_CHAR_LENGTH 2 
using namespace std; 
typedef pair<int, bool> ib; 
unordered_map<string, ib>jiequan = { 
    {"十",{10,false}}, 
    { "百",{100,false} }, 
    { "千",{1000,false} }, 
    { "万",{10000,true} }, 
    { "亿",{100000000,true} }, 
}; 

unordered_map<string, int>shuzi = { 
    {"一",1}, 
    {"二",2}, 
    {"三",3}, 
    {"四",4}, 
    {"五",5}, 
    {"六",6}, 
    {"七",7}, 
    {"八",8}, 
    {"九",9}, 
}; 

long long string2int(string s) 
{ 
    long long ret = 0; 
    int jienum = 0; 
    int num = 1; 
    Bool endquan=false;   //判断到节权位时,上一个是 数字还是权位 如:五万和五十万,因为只有当遇到权位时,才会收集当前数字到节值里,防止漏掉最后一个 
    for (int i=0;i<s.size();i+=CHN_CHAR_LENGTH) 
    { 
        string t = s.substr(i, CHN_CHAR_LENGTH);  //C++下string存取汉字的形式。WINDOWS是用utf-8,汉字是两个字节 
        if (shuzi.find(t) != shuzi.end())   //普通数字 
        { 
            num = shuzi[t]; 
	     	endquan=false; 
            if (i>= s.size() - CHN_CHAR_LENGTH)  //到结尾了 
                return ret + num + jienum; 
        } 
        else if(jiequan.find(t)!=jiequan.end()) 
        { 
            if (jiequan[t].second)   // 节权位 
            { 
		 		if(endquan) 
                    ret += (jienum) * jiequan[t].first;
		 		else 
		       		ret += (jienum+num) * jiequan[t].first; 
                jienum = 0; 
                num = 1; 
            } 
            else   //权位 
            { 
                endquan=true; 
                jienum += num * jiequan[t].first; 
                num = 1; 
            } 
            if (i >= s.size() - CHN_CHAR_LENGTH)   //到结尾了 
                return ret + jienum; 
        } 
    } 
    return ret; 
} 
int main() 
{ 
    string s; 
    while (cin >> s) 
    { 
        long long ret; 
        ret=string2int(s); 
        cout << ret << endl;  
    } 
    return 0; 
} 

参考:
http://data.biancheng.net/view/147.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值