颠倒的价格牌

来源:互联网 发布:十年许嵩雅俗共赏知乎 编辑:程序博客网 时间:2024/04/27 19:06
小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。其标价都是4位数字(即千元不等)。小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了。 


    这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!     当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。
    有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!
    庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。

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

解法1:

使用暴力搜索每位数字,进行相应的判断;使用四个变量表示每一位数字,将可能反转的数字放置于数组中进行下标循环暴力出结果。

#include<stdio.h>int x[7]={1,2,5,6,8,9,0};int stamon1,stamon2;int change(int a){if(a==9){return 6;} else if(a==6){return 9;}return a;}void money1(int temp){int a,b,c,d;int a1,b1,c1,d1;int lasmon=0;for(a=0;a<6;a++){for(b=0;b<7;b++){for(c=0;c<7;c++){for(d=0;d<6;d++){stamon1=x[a]*1000+x[b]*100+x[c]*10+x[d];a1=change(x[a]); b1=change(x[b]);c1=change(x[c]);d1=change(x[d]);lasmon=d1*1000+c1*100+b1*10+a1;if(((lasmon-stamon1)>800) &&((lasmon-stamon1)<900)){if(((lasmon-stamon1)-temp)==558){printf("赔钱:%d\n",stamon2);return ;}}}} }}}int main(){int a,b,c,d;int a1,b1,c1,d1;int lasmon=0;int temp;for(a=0;a<6;a++){for(b=0;b<7;b++){for(c=0;c<7;c++){for(d=0;d<6;d++){stamon2=x[a]*1000+x[b]*100+x[c]*10+x[d];a1=change(x[a]); b1=change(x[b]);c1=change(x[c]);d1=change(x[d]);lasmon=d1*1000+c1*100+b1*10+a1;temp=stamon2-lasmon;if((temp>200) &&(temp<300)){money1(stamon2-lasmon);}}} }}return 0;}

解法2:

还是使用暴力搜索,但是不是将其进行每一位进行暴力,而是整个当作四位数进行暴力。然后进行相应判断。


#include <stdio.h>#include<string.h>int change(int x){int a[4];int y=0;memset(a,0,sizeof(a));int i=0;while(x){a[i++]=x%10;x=x/10;}for(i=0;i<4;i++){if(a[i]==3 || a[i]==4 || a[i]==7)return 0;else if(a[i]==6){a[i]=9;y=y*10+a[i];}else if(a[i]==9){a[i]=6;y=y*10+a[i];}else y=y*10+a[i];}return y;} int main(){int be1,be2;int end1,end2;int dis1,dis2; for(be1=1001;be1<9999;be1++){end1 = change(be1);dis1= be1-end1;if(dis1>200 && dis1<300){for(be2=1001;be2<9999;be2++){end2=change(be2);dis2=end2-be2;if(dis2>800 && dis2<900){if(dis2-dis1==558){printf("%d\n",be1);break;}}}}}return 0;} 



0 0
原创粉丝点击