蓝桥杯省赛历届真题:颠倒的价牌

 1 /*
 2 整体思路:
 3     枚举所有四位数,并将所有可颠倒且颠倒后合法(不以0开头)的四位数找出来,然后
 4 将其与原本数字做差,将<原数,颠倒数,差>作为一个price结构体数据类型存入两个动态数组vector
 5 然后遍历两个vector,双层for循环求和,用两个的vector的diff加起来是否为558,若是则输出六个值
 6 v1的price和v2的price 
 7 */
 8 #include <iostream>
 9 #include <sstream>
10 #include <vector>
11 using namespace std;
12 void i2s(int num,string &str){//数字转字符串 
13     stringstream ss;
14     ss<<num;
15     ss>>str;
16 }
17 void s2i(string &str,int &num){//字符串转数字 
18     stringstream ss;
19     ss<<str;
20     ss>>num;
21 }
22 char to(char ch){//将单位数字颠倒 
23     if(ch=='6')return '9';//因为只有6和9在颠倒后值发生变化,其他的颠倒后都是原值 
24     else if(ch=='9')return '6';
25     else return ch;
26 }
27 string reverse(const string &str){//求四位数颠倒后的结果 
28     string ans;
29     for(int i=3;i>=0;i--){//从最后一位开始颠倒后存入ans 
30         ans.insert(ans.end(),to(str[i]));
31     }
32     return ans;
33 }
34 struct price{//价格结构体 
35     int a,b,c;//原价格,颠倒价格,差值 
36 };
37 vector<price> v1;
38 vector<price> v2;
39 
40 int main(){
41     for(int i=1000;i<10000;i++){
42         string str;
43         i2s(i,str);
44         if(str.find('3')!=string::npos||str.find('4')!=string::npos||str.find('7')!=string::npos||str.rfind('0')==3)
45             continue;
46         string r=reverse(str);
47         int r_int;
48         s2i(r,r_int);
49         int diff=r_int-i;
50         if(diff>-300&&diff<-200){
51             price p={i,r_int,diff};
52             v1.push_back(p);
53         }else if(diff>800&&diff<900){
54             price p={i,r_int,diff};
55             v2.push_back(p);
56         }
57         for(int i=0;i<v1.size();i++){
58             for(int j=0;j<v2.size();j++){
59                 if(v1[i].c+v2[j].c==558){
60                     cout<<v1[i].a<<" "<<v1[i].b<<" "<<v1[i].c<<endl;
61                     cout<<v2[j].a<<" "<<v2[j].b<<" "<<v1[j].c<<endl;
62                 }
63             }
64         }
65     }
66     return 0;
67 }

 

posted @ 2020-08-23 21:24  nilbook  阅读(255)  评论(0编辑  收藏  举报