将阿拉伯数字转化为中文大写是很简单很实用的功能,但由于0这个特殊数字的存在使得实现起来并非那么容易,实现这一功能的关键就是对0的正确处理。该程序是我几个月之前写成的,当时没有加注释,现在程序的实现细节基本忘光了,难以写出注释。只能凭自己模糊的印象大致部分地介绍一下思路和方法,当初思路中的细节已经无法回忆了,没有注释的代码大家只能将就看一下,能看懂最好看不懂也没办法
我当初的想法是现将输入的阿拉伯数字的每一位单独分离出来,按从低位到高位的顺序存放在线性链表里,然后从低位到高位扫描链表。将数字从低位至高位每四位分为一组,最左边的组可以不足位。用Re代表每组中某数字相对于该组最低位的偏移量,di代表每组中最低起始位从数字最低位数起的的位数,从低位至高位从1起以4为间隔依次增大。用mark表示前一位是否为0,用sign表示某数右边低位部分是否全为0,flag表示每组中某数右边在该组中的低位部分是否全为0。程序中用字符型二维数组存放中文大写数字单位,并用三个函数分别完成单位阿拉伯数字到中文大写数字,每组内的数字单位到中文大写,以及每组的最低起始位的数字单位到中文大写的转化
程序的主体部分就是用循环结构从左到右扫描存放数字各位的线性表,扫描过程中把转化出的中文大写数字按由高位至低位的顺序插入另一个链表,扫描完毕后新链表中存放的就是转换结果,可以直接输出。
代码如下:
#include#include #include #include using namespace std; void Num(vector
& p1, const vector & N, const size_t &wei) //将wei表示的阿拉伯数字转化为中文大写 { p1.push_back(N[wei]); } void Re(vector & p1, const vector & R, const size_t &re) //将re表示的组内数字单位转换为中文大写 { p1.push_back(R[re - 1]); } void Di(vector & p1, const vector & D, const size_t &di, const size_t &div) //将di表示的每组的最低起始位的数字单位转换为中文大写 { if (di != 3) p1.push_back(D[di - 1]); for (size_t i = 1; i <= div; ++i) p1.push_back(D[2]); } void addNum(list > &output, const vector & N, const size_t &wei) { vector temp; Num(temp, N, wei); output.insert(output.begin(), temp); } void addRe(list >& output, const vector & R, const size_t& re) { vector temp; Re(temp, R, re); output.insert(output.begin(), temp); } void addDi(list >& output, const vector & D, const size_t& di, const size_t& div) { vector temp; Di(temp, D, di, div); output.insert(output.begin(), temp); } int main() { string t; bool sign, flag, mark; size_t re, di, div; vector N = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; //用字符串数组存放中文大写数字和单位 vector R = { "拾", "佰", "仟" }; vector D = { "万", "亿", "兆" }; cout << "please input the number which you want to convert" < > t; //输入要转换的阿拉伯数字 vector number(t.size()); list > output; for (size_t i = t.size(), j = 0; i > 0;) number[j++] = static_cast (t[--i] - 48); //将输入的阿拉伯数字的各位分离,按从低位至高位的顺序从左至右存放在vector中 sign = false; flag = false; if (number[0]) mark = true; //重要变量的必要初始化 else mark = false; re = 0; di = 0; div = 0; for (size_t wei = 0; wei < number.size(); ++wei) //从左到右扫描链表,进行到中文大写的转化,转换结果存放在ouput类型的链表中 { if (number[wei] == 0) { if (re == 0) { if (sign == true) { if (flag == true) { if (mark == false) addNum(output, N, 0); } } flag = false; } mark = false; } else { if (sign == false) { if (di != 0) addDi(output, D, di, div); } else { if (flag) { if (mark == false) addNum(output, N, 0); if (re == 0) addDi(output, D, di, div); } else addDi(output, D, di, div); } if (re != 0) addRe(output, R, re); addNum(output, N, number[wei]); sign = true; flag = true; mark = true; } if (re == 0) ++re; else { re = (re + 1) % 4; if (re == 0) { ++di; if (di == 4) di = 1; else if (di == 3) ++div; } } } for (const auto& run : output) { for (const auto& go : run) cout << go; } cout << endl; return 0; }



