【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、尽情暴力即可,相信自己,问题规模不大,没有简单的方法,只管暴力!所谓“能力”,就是这么硬着发麻的头皮一步一步地锻炼出来的!
题解:(建议,好的学习方法是借鉴下别人的思路,自己进行大胆尝试解决,能自己跑多远就跑多远;出现问题再回去找找,一味地照搬没多大意义)
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#define ll long long
using namespace std;
#define N 100
char arr[][]= {"ling","yi","er","san","si","wu","liu","Qi","Ba","jiu",
"shi","bAi","qIan","wan"
}; //0~9 + 10~13
int has[]= {,,,,,,,,,,,,,,}; //has[14]为亿
int d[]= {,,,,, ,,,,, ,,,}; //偏移量
int solve(char sn[])
{ string s(sn);
int x,len=s.length(); while(x=s.find("qi"),x>=&&x<len) //替换qi 和 qian
{
if(x+<=len-&&s[x+]!='a')
s[x]='Q';
else if(x+>=len)
s[x]='Q';
else
s[x+]='I';
}
while(x=s.find("ba"),x>=&&x<len) //替换Ba 和 bAi
{
if(x+<=len-&&s[x+]!='i')
s[x]='B';
else if(x+>=len)
s[x]='B';
else
s[x+]='A';
}
x=s.find("yuan"); //删掉末尾的 yuan
if(x>=&&x<len)
s.erase(x,);
// cout<<s<<" ~~删减yuan后~"<<endl;
//特判1亿元
x=s.find("yiyi");
if(x>=&&x<len)
return has[]; x=;
len=s.length();
int sum=,ss=;
while(x<len)
{
int i=;//代表是第几个汉字
while(i<&&s.find(arr[i])!=x)
i++;
if(i==) //出现错误,反馈error
{
cout<<"error"<<endl;
break;
}
if(i>=&&i<=)
{
if(ss==)sum+=has[i];
ss*=has[i],sum+=ss,ss=;
}
else if(i==)
sum+=ss,ss=,sum*=has[];
else if(i>)
ss=has[i]; for(int j=x; j<x+d[i]; j++) //走一步删一步
s[j]='*';
x+=d[i];
// printf("***i=%d x=%d ss=%d sum=%d\n",i,x,ss,sum);
}
return sum+ss;
}
double get_op(char sn[])
{
string s(sn);
int x,len=s.length();
double op=0.0;
while(x=s.find("qi"),x>=&&x<len) //替换qi 和 qian
{
if(x+<=len-&&s[x+]!='a')
s[x]='Q';
else if(x+>=len)
s[x]='Q';
else
s[x+]='I';
}
while(x=s.find("ba"),x>=&&x<len) //替换Ba 和 bAi
{
if(x+<=len-&&s[x+]!='i')
s[x]='B';
else if(x+>=len)
s[x]='B';
else
s[x+]='A';
}
int sum=,ss=;
x=s.find("zhe"); //删掉末尾的 zhe
if(x>=&&x<len)
s.erase(x,);
len=s.length();
x=;
int cnt=;
while(x<len)
{
int i=;//代表是第几个个汉字
while(i<&&s.find(arr[i])!=x)
i++;
if(i==)
{
cout<<"error"<<endl;
break;
}
op=op*10.0+has[i];
cnt++;
for(int j=x; j<x+d[i]; j++) //走一步删一步
s[j]='*';
x+=d[i];
// printf("***i=%d x=%d op=%lf \n",i,x,op);
}
while(cnt--)
op=op*0.1;
return op;
}
int main()
{
char s1[],s2[],s3[];
while(scanf("%s%s%s",s1,s2,s3)!=EOF)
{
if(strcmp(s1,"yuanjia")==) //给的是原价和折扣op
{
double cost,discost,op; //原价为cost,折扣后的价为discost!
cost=solve(s2)*1.0;
op=get_op(s3);//printf("op*****%.6lf\n",op); discost=cost*op;
printf("%.2lf %.2lf\n",cost,discost);
}
else //给的是折扣价和 折扣op
{
double cost,discost,op;
discost=solve(s2);
op=get_op(s3);//printf("op*****%.6lf\n",op);
cost=discost/op;
printf("%.2lf %.2lf\n",cost,discost);
}
// printf("****%.4lf\n",1.11/10.00);
} return ;
}
(可以模仿着写写,花一天时间搞定也是值得的!)
【ZZNU-oj-2116:人间不值得】(1亿以内的货币拼音转数值求折扣价原价)--hash+String大法好+字符串处理+超大暴力模拟题的更多相关文章
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- ZZNU - OJ - 2080 : A+B or A-B【暴力枚举】
2080 : A+B or A-B(点击左侧标题进入zznu原题页面) 时间限制:1 Sec 内存限制:0 MiB提交:8 答案正确:3 提交 状态 讨论区 题目描述 Give you three s ...
- 用vector与bitset分别创建1亿以内的素数表,比较快慢
vector容器: 代码如下: #include<iostream>#include<vector>#include<ctime>using namespace s ...
- 4190. Prime Palindromes 一亿以内的质数回文数
Description The number 151 is a prime palindrome because it is both a prime number and a palindrome ...
- SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- 楼天城楼教主的acm心路历程(作为励志用)
楼主个人博客:小杰博客 利用假期空暇之时,将这几年GCJ,ACM,TopCoder 參加的一些重要比赛作个 回顾.昨天是GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前,我刚刚 ...
- 【转】楼天城楼教主的acm心路历程(作为励志用)
利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年前,我刚刚参加ACM 时参加北京赛区2 ...
- 剪辑的楼天城的ACM之路
楼天城楼教主的acm心路历程(剪辑) 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年 ...
- 楼塔当天领袖acm心理(作为励志使用)
楼主个人博客:吉尔博客 假期空闲的时候使用.这些年来GCJ.ACM,TopCoder 的一个号码的一重要的比赛的参与 回顾.GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前.我 ...
随机推荐
- 并查集与最小生成树Kruskal算法
一.什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个用于次数据结构的操作: Fi ...
- Java面试 - == 和 equals 的区别?
==:如果比较的对象是基本数据类型,则比较的是数值是否一致:如果比较的是引用数据类型,则比较的是对象的地址值是否一致. equals():equals()方法不能用于比较基本数据类型的对象,如果对象和 ...
- datanode无法连接到namenode
datanode无法连接到namenode namenode在清空hadoop.tmp.dir和namenode.dir文件夹重新格式化后,datanode还是无法连接到namenode并报错: hd ...
- redis批量删除键的操作
网上也有很多关于批量删除的命令,例如,我们要删除以KEY开头的键.linux系统中当屏幕显示127.0.0.1:6379时,采用如下命令 redis-cli -h 192.168.1.1 -p 637 ...
- 数组、可变参数 、this关键字 (札记)
Thinking in java 读书笔记(P84 ~ P104) 作者:淮左白衣 写于:2018年4月10日16:42:57 目录 this 为什么可以代表调用对象 数组 数组中的 length 定 ...
- java 用户线程和守护线程
在Java中通常有两种线程:用户线程和守护线程(也被称为服务线程)通过Thread.setDaemon(false)设置为用户线程通过Thread.setDaemon(true)设置为守护线程线程属性 ...
- Scratch技巧—-使用克隆技术实现菜单按钮
昨天讲了克隆技术的一个具体应用:生成菜单按钮.有的小朋友迫不及待的试验了一下,发现菜单按钮是生成了,但是如何触发相应的按钮功能呢?触发功能的处理代码也是在克隆体里面实现哦.请看案例: 启动程序时,先隐 ...
- element-ui 合并单元格的方法
arraySpanMethod({ row, column, rowIndex, columnIndex }) { // 只合并区域位置 //columnIndex 横的第一列 ...
- SAS学习笔记3 输入输出格式(format、informat函数)
format函数:定义输出格式 informat函数:定义输入格式 proc format:定义输出格式 从外部读取文件 proc format过程步
- (九)mybatis之延迟加载
一.为什么要使用延迟加载? 使用延迟加载的意义 在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度快. 如果查询单表就可以满足需求,一开始先查询单表,当需要关联 ...