• 【蓝桥杯】颠倒的价牌


    颠倒的价牌

    小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。其标价都是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,把所有结果都放到集合里最后一起输出,发现答案只有一个。

    运行结果图:

  • 相关阅读:
    java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁(转)
    MySQL存储引擎--MyISAM与InnoDB区别
    Socket详解
    Java线程池参数
    Java反射机制(转)
    java注解
    docker入门实例
    docker常用命令总结
    showdoc 自动脚本安装
    [mysql]You must reset your password using ALTER USER statement before executing this statement.
  • 原文地址:https://www.cnblogs.com/Aikoin/p/10473453.html
Copyright © 2020-2023  润新知