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 }