第四届蓝桥杯:颠倒的价牌

Begin

记录一下自己的学习过程啦~~

上题目

颠倒的价牌

小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。
其标价都是4位数字(即千元不等)。
小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了。
这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!
当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。
有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!
庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。
请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?

思路过程

1.已知总利润,求赔钱的正确价格
2.正向推导一波
(1)两个价格牌都倒挂了并且卖出:说明价格是由1 2 5 6 8 9 0 组成
(2)由于可以倒读:最后一位数和首位数不为0
(3)数字反转

beforeafter
00
11
22
55
69
88
96

(4)反转后,不仅有些数字大小发生改变,而且数字顺序也发生改变

3.逆向推导一波
(1)若要求原价格,需求反转后的错误价格
(2)若要求错误价格,需要根据两个错误价格的关系求解

代码

public class Main {
    public static void main(String[] args) {
        int[] s = {0, 1, 2, 5, 6, 8, 9};
        int[] m = new int[100000];
        int sum, num1, num2, min, max, n = 0;
        for (int a = 1; a < 7; a++) {
            for (int b = 0; b < 7; b++) {
                for (int c = 0; c < 7; c++) {
                    for (int d = 1; d < 7; d++) {
                        sum = s[a] * 1000 + s[b] * 100 + s[c] * 10 + s[d];
                        m[n] = sum;
                        n++;
                    }
                }
            }
        }
        for(int i=0;i<m.length;i++){
            for(int j=0;j<m.length;j++){
                num1=reverse(m[i])-m[i];
                num2=reverse(m[j])-m[j];
                if(num1<-200&&num1>-300&&num2>800&&num2<900&&num1+num2==558){
                    System.out.println(m[i]);
                    break;
                }
            }
        }
    }

    public static int reverse(int x) {
        int[] s = new int[4];
        int a, sum = 0, i = 0;
        while (x !=0) {
            a = x % 10;
            s[i] = a;
            x = x / 10;
            i++;
        }
        for (i = 0; i < 4; i++) {
            if (s[i] == 6) {
                s[i] = 9;
            }
            else if (s[i] == 9) {
                s[i] = 6;
            }
            sum = s[i] + sum * 10;
        }
        return sum;
    }
}

总结

1.将int转为string

1)s=i+"";   //会产生两个String对象2)s=String.valueOf(i); //直接使用String类的静态方法,只产生一个对象3)i=Integer.parseInt(s);//直接使用静态方法,不会产生多余的对象,但会抛出异常4)i=Integer.valueOf(s).intValue();
//相当于 new Integer(Integer.parseInt(s)),也会抛异常,但会多产生一个对象

2.将字符串reverse

String str2=new StringBuilder(str1).reverse().toString();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值