四、题目:颠倒的价牌
Description
小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。
其标价都是4位数字(即千元不等)。
小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参见图片)。
这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!
当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。
有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!
庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。
请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?
**分析思路:**枚举所有可以颠倒的四位数
将其颠倒过来,与原来的数值做差,将-200多与800多记录下来,分别记录在两个集合中
遍历两个集合,-200多和800多两两求和,结果为558的即为正确答案
stringstream用法
当我们需要按预定的格式将程序中的数据保存在一个string 中的时候,可以先创建一个stringstream 对象,并通过运算符 ”<<“ 将数据传递给 stringstream 对象。(这与通过”<<“ 使用cout 对象的方法相同。)接着,我们可以通过调用stringstream 类的函数str() 将对象所包含的内容赋给一个string对象。在下面的程序中,我们先将数据传递给一个stringstream 对象,然后通过该 stringstream 对象将数值赋给一个string 对象。
str里面是i的字符串形式,里面的3,4,7,还有最后一位也就是数组第4位不能为0
代码:
#include<iostream>
#include<sstream>
#include<vector>
using namespace std;
void i2s(int num,string &str){ //将数字转换为字符串
stringstream ss; //用法类似于cout
ss<<num; //>>是将那个num传入到stringstream中
ss>>str; //用stringstream 类的函数str() 将对象所包含的内容赋给一个string对象。
}
void s2i(string &str,int &num){
stringstream ss; //将字符串反转为数字
ss<<str;
ss>>num;
}
char to(char x){ //字符的翻转
if(x=='6') return '9';
else if(x=='9') return '6';
else return x; //x:指0,1,2,5,8,这几个数字反转后还是本身
}
string reserve(const string &str){ //reserve作用类似旋转180°
string ans; //结果
for(int i=3;i>=0;i--){ //扫描,从最后一位开始转换之后
ans.insert(ans.end(),to(str[i])); //把最后一个字符插入
}
return ans;
}
struct price{ //定义一个价格的结构体
int a,b,c; //a:原始价格 ,b:翻转颠倒价格,c:原始价格与颠倒价格的差
};
vector<price> v1; //存储-200多的
vector<price> v2; //存储+800多的
int main(){
cout<<reserve<<endl; //在这个地方可以测试原题中给出的数据
//枚举所有可以颠倒的四位数
// 将其颠倒过来,与原来的数值做差,将-200多与800多记录下来,分别记录在两个集合中
//遍历两个集合,-200多和800多两两求和,结果为558的即为正确答案
for(int i=1000;i<10000;i++){
string str;
i2s(i,str);
if(str.find('3')!=string::npos||str.find('4')!=string::npos||str.find('7')!=string::npos||str.rfind('0')==3)
//str里面是i的字符串形式,里面的3,4,7,还有最后一位也就是数组第4位不能为0
continue;
string r=reserve(str); //翻转的字符
int r_int;
s2i(r,r_int); //r_int就是翻转后的价格,i是原始价格
int plus=r_int-i; //plus就是价格差
if(plus>-300&&plus<-200){ //价格范围
price p={i,r_int,plus};
v1.push_back(p);
}
else if(plus>800&&plus<900){ //价格范围
price p={i,r_int,plus};
v2.push_back(p);
}
//此时v1存储-200多的价格,v2存储+800多
for(int i=0;i<v1.size();i++){
for(int j=0;j<v2.size();j++){
if(v1[i].c+v2[j].c==558){
printf("%d %d %d %d %d %d\n",v1[i].a,v1[i].b,v1[i].c,v2[j].a,v2[j].b,v2[j].c);
}
}
}
}
return 0;
}
答案为:9088