与数字相关转换(包括英文和汉语拼音)
2015-09-13 21:25
302 查看
数字到英文描述的转换
1.给定一个整数,打印该整数的对应的英文描述,例如输入1234,输出“One Thousand,Two Hundred Thirty Four”
解题思路:
例如在转换19323984时,我们可以考虑分段处理,每三位转换一次,并在适当的位置插入”Thousand”和”million”,也即convert(19 323 984)=conver(19)+” million “+convert(323)+” thousand “+convert(984)#include<iostream> #include<string> using namespace std; string digits[]={"One","Two","Three","Four","Five","Six","Seven","Eight","Nine"}; string teens[]={"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"}; string tens[]={"Ten","Twenty","Thirty","Fourty","Fifty","Sixty","Seventy","Eighty","Ninety"}; string bigs[]={"","Thousand","Million","Billion"}; string numToString100(int number) { string str=""; //转换百位的地方 if(number>100) { str+=digits[number/100-1]+" Hundred "; number%=100; } //转换十位的地方 if(number>=11 && number<=19) { str+=teens[number-11]+" "; } else if(number==10 || number>=20) { str+=tens[number/10-1]+" "; number%=10; } if(number>=1 && number<=9) { str+=digits[number-1]+" "; } return str; } string numToString(int number) { if(number==0) { return "Zero"; } else if(number<0) { return "Negative"+numToString(-1*number); } int count=0; string str=""; while(number>0) { if(number%1000 != 0) { str=numToString100(number%1000)+bigs[count]+" "+str; } number/=1000; count++; } return str; } int main() { int number; cin>>number; string result; result=numToString(number); cout<<result<<endl; }
程序运行结果:
2.拼音转换为数字
将中文数字的拼音字符转为最终的数字,每个字拼音的首字母大写,比如:JiuWanJiuQianJiuBaiJiuShiJiu表示九万九千九百九十九,即阿拉伯数字99999.
你当然就得每个数字的汉语拼音,但是还是提示你一下,Ling、Yi、Er、San、Si、Wu、Liu、Qi、Ba、Jiu、Shi、Bai、Qian、Wan。
为了简单起见,我们要处理的数字在万以内,不含负数,十、百、千、万等单位前面一定有数字,如YiShi表示10.
输入:中文数字的拼音字符串
输出:阿拉伯数字
样例输入:SanBaiLingSan
样例输出:303
解题思路:
首先遍历输入的拼音字符串,根据拼音首字母大写其他字母小写的特点,将拼音字符分离出来,再与拼音字符表进行比较,将其转换成数字和对应单位的值
需要注意的是1.对于最后一个输入字符串中的最后一个字母要做特殊处理,防止出现死循环,方法是变量i++;
2.要用一个变量来保存单位前面的数字,如果得到的是单位,则需要将之前保存的乘以相应的单位再相加
#include<iostream> #include<string> #include<cctype> using namespace std; string num[14]={"Ling","Yi","Er","San","Si","Wu","Liu","Qi","Ba","Jiu","Shi","Bai","Qian","Wan"}; int getNum(string str) { //cout<<str<<endl; for(int n=0;n<14;n++) { if(num ==str) return n; } } int main() { string str,temp; cin>>str; int len=str.size(); int result=0,begin=0,flag=0,number; for(int i=0;i<len;i++) { if(begin==0 || islower(str[i]) && i!=len-1) { temp.push_back(str[i]); begin=1; } else { if(i==len-1) { temp.push_back(str[i]); i++; //因为后面i要减1,否则会进入死循环 } number=getNum(temp); if(number>=0 && number<=9) { flag=number; } else { if(number==10) result += flag*10; else if(number==11) result += flag*100; else if(number==12) result +=flag*1000; else if(number==13) result=flag*10000; } temp.erase(); i--; begin=0; } } result += flag; cout<<result<<endl; }
程序运行结果:
相关文章推荐
- 按两次返回键退出
- HDU 5442 Favorite Donut
- 《剑指Offer》面试题:数组中的逆序对的总数
- 编码问题
- C++模板的一些巧妙功能
- java常用类与集合框架相关知识总结
- C++模板的一些巧妙功能
- Lua C PAI中的lua_dump
- 小白书之最优程序
- 关于Hadoop系列文章
- SED 使用 介绍
- JavaScript设计模式之----组合模式
- JavaScript设计模式之----组合模式
- IMOOC_String
- 兔子--android:ems="3"是什么意思
- 十天学会php第五天
- Docker1.8在Centos7下的安装
- 程序设计模式-“OPGA设计模式”简介
- 求二叉树两节点的最小父节点(有父节点指针)
- iOS中的视图跳转的三种方式(代码跳转,根据桥跳转,按钮跳转)