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