描述: | 考试题目和要点: 1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。(30分) 2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如¥ 532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。(30分) 3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如¥6007.14,应写成“人民币陆仟零柒元壹角肆分“。(
|
知识点: | 字符串 |
题目来源: | 内部整理 |
练习阶段: | 初级 |
运行时间限制: | 10Sec |
内存限制: | 128MByte |
输入: | 输入一个doulbe数 |
输出: | 输出人民币格式 注: 下面乱码为: 人民币拾伍万壹仟壹佰贰拾壹元壹角伍分
人民币拾伍万壹仟壹佰贰拾壹元壹角伍分
|
样例输入: | 151121.15 |
样例输出: | �����ʰ����ҼǪҼ�۷�ʰҼԪҼ����� |
首先,看到输入类型为double,就应该考虑截取double 类型的小数点后2位,保留到分。然后有个整字, 说明对于没有小数的要加个整字来说明。好吧,描述第二点说到了这些。
然后第三点很有意思,当有多个0时,只写出一个0,这个其实很容易实现。
然后应该没有什么要注意的地方了。
思路:
首先,要知道其位数,位数的判断由于这里没有对效率的过度要求,所以我经常用时间来换取设计的简单,这里写一个 将位数转换为中文的亿万百的函数。然后又考虑到截取小数点,这里最好的方法是将读取的double类型作为string类型储存,然后分成两端,小数点左端来使用转换函数转换称正确的文字,函数使用迭代,这样为更好看一点。迭代如何解决0的问题,以及,这里又出现如果前几位数字为0应该如何处理。在每次对非0数字处理后,检测下一位是否为0,如果是在字符串后加0,然后函数遇0跳过。对于小数点右边的两位,只要简单的将两位通过if语句即可获取结果。
这里关于数字转换成中文的思路是不正确的,中文一般是以4个单位为一组,所以应该将数字按4位进行分割,以获得其正确格式,然后加上对应的这4位的位数,0,万,亿。
题目中又说到当数字中间有0才用零表示,而对于0一直到结束,这是不需要写 零出来的,但是这样就需要使用一个0位标识或者换其他思路即不能使用4位分割。若使用4位分割则需要从最低位来开始转换。
写出代码:
c++中double类型转string类型的方法,使用stringstream
stringstream ss;
string str="";
string output = "";
ss<<d;
ss>>str;
这种方法是不正确的,当数位较多时,会自动转换为坑爹的科学计数法。
string的find函数,返回下标,但对于未找到,使用string中的npos常量 。
编写中遇到许多错误,不详述了,其中一个,示例居然给的读作 十五万,而不是一十五万,较坑。
#include <iostream>; #include <string> #include <sstream> using namespace std; string ZH[] = { "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; //这个函数只能处理四位数据,未满四位,补x,从qian往hou看所以一开始zero为否,不加0,遇数字为真,加零,遇0变否 string change4ToZH(string input,bool *zero){ string str= ""; if(input[0]!= '0' ){ if(input[0] != 'x'){ if(*zero == true) str += '零'; str += ZH[input[0] - '1'] +"仟"; *zero = false; } }else{ *zero = true; } if(input[1]!= '0' ){ if(input[1] != 'x'){ if(*zero == true) str += '零'; str += ZH[input[1] - '1'] +"佰"; *zero = false; } }else{ *zero = true; } if(input[2]!= '0' ){ if(input[2] != 'x'){ if(*zero == true) str += '零'; if(input[2]!= '1') str += ZH[input[2] - '1'] ; str +="拾"; *zero = false; } }else{ *zero = true; } if(input[3]!= '0' ){ if(input[3] != 'x'){ if(*zero == true) str += '零'; str += ZH[input[3] - '1'] ; *zero = false; } }else *zero = true; return str; } //将小数点左端转换为中文 string changeRightToZH(string right){ string output = ""; /* int times = right.length() / 12 + 1; for( int i = 0 ; i < times * 12 - right.length() ; i++){ right = 'x' + right;//补位 } bool zero = false; string fourchar,yi = "";//全部的亿 for( int i = times; i > 0 ; i -- ){ fourchar = right.substr(12*(times -i -1),12); string buff = } } */ int length =12- right.length(); for(int i = 0 ; i<length ;i++){ right = 'x' + right; } string buff = ""; bool zero =false; buff = change4ToZH(right.substr(0,4),&zero); if(buff != "") output += buff + "亿"; buff = change4ToZH(right.substr(4,4),&zero); if(buff != "") output += buff + "万"; buff = change4ToZH(right.substr(8,4),&zero); output += buff ; if(output == "") output = "零"; return "人民币"+output+"元"; } //人民币转换 void main(){ double d; cin >> d; string str=""; string output = ""; char dd[100]; sprintf_s(dd,100,"%f",d); str = (string) dd; int point = str.find("."); string left,leftout = ""; if(point != str.npos){ left = str.substr(point+1); if(left.length() > 0 ){ if(left[0] != '0') leftout += ZH[left[0] - '1'] + "角"; if(left.length()>1 &&left[1] != '0') leftout += ZH[left[1] - '1'] + "分"; } str = str.substr(0,point); } output = changeRightToZH(str); if(leftout =="") output += "整"; else output += leftout; cout<< output; }
提交正确。
这道题目感觉还是比较坑的,中间我还放弃了更加完美但更加复杂的解法,即对所有位都进行计算,而不是仅仅设定其在12位即亿这个单位之内,但是那样就更加复杂麻烦了,我还是一个比较怕麻烦的人。