2013蓝桥杯C++A:颠倒的价牌

四、题目:颠倒的价牌
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

发布了106 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/104887453
今日推荐