【蓝桥杯】颠倒的价牌

颠倒的价牌

小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。其标价都是4位数字(即千元不等)。小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了。  

 

这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!

当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。   

有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!

庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。

请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?

答案是一个4位的整数,请通过浏览器直接提交该数字。

下面是自己写的代码,算出来是9088:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <vector>
 6 #include <set>
 7 using namespace std;
 8 
 9 //枚举所有可以颠倒的四位数(1 2 5 6 8 9 0,0不可做末尾) 
10 //颠倒后与原来的数字一个少了两百多,一个多了八百多
11 //八百多与两百多做差是558 
12 
13 int les[9999],more[9999];
14 int a[7] = {1,2,5,6,8,9,0};  //a0 - a6
15 set<int> s;
16 set<int>::iterator it;
17 
18 int reverse(int n){   //颠倒后的数字 
19     int b = 0,i = 3;
20     while(n){
21         if(n%10==6) b += 9*pow(10,i);
22         else if(n%10==9) b += 6*pow(10,i);
23         else b += (n%10)*pow(10,i);
24         i--;
25         n/=10;
26     }
27     return b;
28 }
29 
30 int main()
31 {
32     int ans = 0,le = 0,mo = 0; 
33     for(int i = 0;i<=6;i++) //千位 
34         for(int j=0;j<=6;j++) //百位 
35             for(int k=0;k<=6;k++) //十位 
36                 for(int l=0;l<=5;l++){ //个位 
37                     ans = 1000*a[i] + 100*a[j] + 10*a[k] + a[l];
38                     if(ans-reverse(ans)>=200 && ans-reverse(ans)<300) les[le++] = ans;
39                     else if(reverse(ans)-ans>=800 && reverse(ans)-ans<900) more[mo++] = ans;
40                 } 
41     for(int i=0;i<le;i++)
42         for(int j=0;j<mo;j++)
43             if(((reverse(more[j])-more[j]) - (les[i]-reverse(les[i])) == 558) ){
44                 s.insert(les[i]);
45                 //cout<<les[i]<<endl;
46             }    
47      for(it = s.begin();it!=s.end();it++){
48         cout<<*it<<endl;
49     }
50     
51     return 0;
52 }

因为发现有很多重复的,所以弄了个set,把所有结果都放到集合里最后一起输出,发现答案只有一个。

运行结果图:

原文地址:https://www.cnblogs.com/Aikoin/p/10473453.html