蓝桥杯省赛历届真题:颠倒的价牌
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 }