华为机试—拼音翻译成阿拉伯数字(有Wan,Qian,Bai,Shi单位)

题目:拼音翻译成阿拉伯数字

输入一串拼音,输出它代表的阿拉伯数字(Ling,Yi,Er,San,Si,Wu,Liu,Qi,Ba,Jiu),数字不会超过十万

为了处理方便,输入一定是数字带单位的,例如10会是YiShi,而不是一个单独的Shi.

 

输入 JiuWanJiuQianJiuBaiJiuShiJiu

输出 99999


基本思路:

遍历找到下一个大写字母,截取子串,比较匹配,重要的是处理最后一位是数字还是单位。


#include <iostream>
#include <string>  
using namespace std;  
  
void filter(string str)  
{  
    //各字符串的下标即为其对应的阿拉伯数字  
    char *ch[]={"Ling","Yi","Er","San","Si","Wu","Liu","Qi","Ba","Jiu"};  
	int a=0;//存储数字
    int i,j=1,k,len,sum=0,flag;  
    string substr;  
    len=str.length(); 
    for(i=0;i<len;)  
    {    
        //遇到下一个大写字母的停下来
		if(str[j]<'a'||j==len)
		{
			flag=0;//标记最后是数字还是wan,qian,bai,shi

			substr=str.substr(i,j-i);

			if(!substr.compare("Wan")){
				sum+=a*10000;
			}else if(!substr.compare("Qian")){
				sum+=a*1000;
			}else if(!substr.compare("Bai")){
				sum+=a*100;
			}else if(!substr.compare("Shi")){
				sum+=a*10;
			}else{
				for(k=0;k<10;k++) {              
					if(!substr.compare(ch[k]))  
					{
						flag=1;
						a=k;
						//printf("%d",k);//相等则打印出数字  
						break;  
					} 
				}
			}
            i+=(j-i);//i跳到下一个大写字母开始
			j=i+1;
		}else{
			j++;
		}
    } 
	if(flag)
		printf("%d\n",sum+a);
	else
		printf("%d\n",sum);
}  
  
int main()  
{  
    string str;  
    while(cin>>str){ 
    //cin>>str;
     filter(str);  
    }
    return 0;  
}  

测试结果,可能不周全,欢迎查漏补缺:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值