ZZNU-oj-2116:人间不值得(1亿以内的货币拼音转数值求折扣价原价)--hash+String大法好+字符串处理+超大暴力模拟题
Posted zhazhaacmer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZZNU-oj-2116:人间不值得(1亿以内的货币拼音转数值求折扣价原价)--hash+String大法好+字符串处理+超大暴力模拟题相关的知识,希望对你有一定的参考价值。
题目描述
家缠万贯来几时,我今停杯一问之。人攀暴富不可得,贫穷却与人相随。何以解忧,唯有暴富。spring做梦都想暴富,但是又苦于囊中羞涩。每次消费都会精打细算,所以每次消费都会记在小本本上。可惜spring是个汉字盲,你能帮他来完成汉字拼音转化为数字么。spring每次的消费都是一行格式表示分别为原价(或折扣价) 价格 折扣度 的拼音形式展开。 拼音中不包含汉字“两”的拼音,只有汉字“二”的拼音。
输入
输入一行 共有三个字符串,分别代表 原价(折扣价)拼音 和 价格拼音 以及 折扣度拼音,表示spring每次的消费。
其中 价格拼音转化成数字不超过1亿元,价格拼音的组成符合我们日常的叫法,如5010 五千零十元。折扣度拼音转化成汉字将不多于五个汉字,如六七折,一二三四折等,不存在零折,但可能存在零一折等。数字都是正整数。
输出
来帮他完成汉字拼音转化,spring需要你。求出 原价为多少钱,以及折扣价为多少,两者中间保留空格,保留两位有效数字。占一行。
样例输入
复制
yuanjia erbaiyuan wuzhe zhekoujia yibaiyuan wuzhe
样例输出
复制
200.00 100.00 200.00 100.00
提示
思路:1、构造拼音到数值的has表,处理冲突的“qi”和“qian”,“ba”和“bai”。
2、String类的find()函数是个好东西,直接找到对应的子字符串,然后换成“Qi”和“qIan”,“Ba”和“bAi”
3.int d[]表示偏移量数组,find(“子字符串”)返回-1表示没有结果,其余表示可以找到,然后向后偏移d【i】位,d[i]其实等于当前子字符串的长度;还有在偏移一段后,要将刚刚找到的字符串抹掉——全部变成“*******”号!
4、其余的问题,慢慢调试,建议在关键循环中加上printf调试!
5、删掉末尾的 yuan, s.erase(x,4); 特判1亿元等等细节方便解决问题!
6、尽情暴力即可,相信自己,问题规模不大,没有简单的方法,只管暴力!所谓“能力”,就是这么硬着发麻的头皮一步一步地锻炼出来的!
题解:(建议,好的学习方法是借鉴下别人的思路,自己进行大胆尝试解决,能自己跑多远就跑多远;出现问题再回去找找,一味地照搬没多大意义)
1 #include <iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<string> 5 #include<algorithm> 6 #define ll long long 7 using namespace std; 8 #define N 100 9 char arr[20][10]= {"ling","yi","er","san","si","wu","liu","Qi","Ba","jiu", 10 "shi","bAi","qIan","wan" 11 }; //0~9 + 10~13 12 int has[]= {0,1,2,3,4,5,6,7,8,9,10,100,1000,10000,100000000}; //has[14]为亿 13 int d[]= {4,2,2,3,2, 2,3,2,2,3, 3,3,4,3}; //偏移量 14 int solve(char sn[]) 15 { 16 17 string s(sn); 18 int x,len=s.length(); 19 20 21 while(x=s.find("qi"),x>=0&&x<len) //替换qi 和 qian 22 { 23 if(x+2<=len-1&&s[x+2]!=‘a‘) 24 s[x]=‘Q‘; 25 else if(x+2>=len) 26 s[x]=‘Q‘; 27 else 28 s[x+1]=‘I‘; 29 } 30 while(x=s.find("ba"),x>=0&&x<len) //替换Ba 和 bAi 31 { 32 if(x+2<=len-1&&s[x+2]!=‘i‘) 33 s[x]=‘B‘; 34 else if(x+2>=len) 35 s[x]=‘B‘; 36 else 37 s[x+1]=‘A‘; 38 } 39 x=s.find("yuan"); //删掉末尾的 yuan 40 if(x>=0&&x<len) 41 s.erase(x,4); 42 // cout<<s<<" ~~删减yuan后~"<<endl; 43 //特判1亿元 44 x=s.find("yiyi"); 45 if(x>=0&&x<len) 46 return has[14]; 47 48 x=0; 49 len=s.length(); 50 int sum=0,ss=0; 51 while(x<len) 52 { 53 int i=0;//代表是第几个汉字 54 while(i<14&&s.find(arr[i])!=x) 55 i++; 56 if(i==14) //出现错误,反馈error 57 { 58 cout<<"error"<<endl; 59 break; 60 } 61 if(i>=10&&i<=12) 62 { 63 if(ss==0)sum+=has[i]; 64 ss*=has[i],sum+=ss,ss=0; 65 } 66 else if(i==13) 67 sum+=ss,ss=0,sum*=has[13]; 68 else if(i>0) 69 ss=has[i]; 70 71 for(int j=x; j<x+d[i]; j++) //走一步删一步 72 s[j]=‘*‘; 73 x+=d[i]; 74 // printf("***i=%d x=%d ss=%d sum=%d ",i,x,ss,sum); 75 } 76 return sum+ss; 77 } 78 double get_op(char sn[]) 79 { 80 string s(sn); 81 int x,len=s.length(); 82 double op=0.0; 83 while(x=s.find("qi"),x>=0&&x<len) //替换qi 和 qian 84 { 85 if(x+2<=len-1&&s[x+2]!=‘a‘) 86 s[x]=‘Q‘; 87 else if(x+2>=len) 88 s[x]=‘Q‘; 89 else 90 s[x+1]=‘I‘; 91 } 92 while(x=s.find("ba"),x>=0&&x<len) //替换Ba 和 bAi 93 { 94 if(x+2<=len-1&&s[x+2]!=‘i‘) 95 s[x]=‘B‘; 96 else if(x+2>=len) 97 s[x]=‘B‘; 98 else 99 s[x+1]=‘A‘; 100 } 101 int sum=0,ss=0; 102 x=s.find("zhe"); //删掉末尾的 zhe 103 if(x>=0&&x<len) 104 s.erase(x,4); 105 len=s.length(); 106 x=0; 107 int cnt=0; 108 while(x<len) 109 { 110 int i=0;//代表是第几个个汉字 111 while(i<14&&s.find(arr[i])!=x) 112 i++; 113 if(i==14) 114 { 115 cout<<"error"<<endl; 116 break; 117 } 118 op=op*10.0+has[i]; 119 cnt++; 120 for(int j=x; j<x+d[i]; j++) //走一步删一步 121 s[j]=‘*‘; 122 x+=d[i]; 123 // printf("***i=%d x=%d op=%lf ",i,x,op); 124 } 125 while(cnt--) 126 op=op*0.1; 127 return op; 128 } 129 int main() 130 { 131 char s1[100],s2[100],s3[100]; 132 while(scanf("%s%s%s",s1,s2,s3)!=EOF) 133 { 134 if(strcmp(s1,"yuanjia")==0) //给的是原价和折扣op 135 { 136 double cost,discost,op; //原价为cost,折扣后的价为discost! 137 cost=solve(s2)*1.0; 138 op=get_op(s3);//printf("op*****%.6lf ",op); 139 140 discost=cost*op; 141 printf("%.2lf %.2lf ",cost,discost); 142 } 143 else //给的是折扣价和 折扣op 144 { 145 double cost,discost,op; 146 discost=solve(s2); 147 op=get_op(s3);//printf("op*****%.6lf ",op); 148 cost=discost/op; 149 printf("%.2lf %.2lf ",cost,discost); 150 } 151 // printf("****%.4lf ",1.11/10.00); 152 } 153 154 return 0; 155 }
以上是关于ZZNU-oj-2116:人间不值得(1亿以内的货币拼音转数值求折扣价原价)--hash+String大法好+字符串处理+超大暴力模拟题的主要内容,如果未能解决你的问题,请参考以下文章
用vector与bitset分别创建1亿以内的素数表,比较快慢