征战蓝桥 —— 2013年第四届 —— C/C++A组第4题——颠倒的价牌
生活随笔
收集整理的這篇文章主要介紹了
征战蓝桥 —— 2013年第四届 —— C/C++A组第4题——颠倒的价牌
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
標(biāo)題: 顛倒的價牌
小李的店里專賣其它店中下架的樣品電視機,可稱為:樣品電視專賣店。其標(biāo)價都是4位數(shù)字(即千元不等)。小李為了標(biāo)價清晰、方便,使用了預(yù)制的類似數(shù)碼管的標(biāo)價簽,只要用顏色筆涂數(shù)字就可以了(參見p1.jpg)。這種價牌有個特點,對一些數(shù)字,倒過來看也是合理的數(shù)字。如:1 2 5 6 8 9 0 都可以。這樣一來,如果牌子掛倒了,有可能完全變成了另一個價格,比如:1958 倒著掛就是:8561,差了幾千元啊!! 當(dāng)然,多數(shù)情況不能倒讀,比如,1110 就不能倒過來,因為0不能作為開始數(shù)字。有一天,悲劇終于發(fā)生了。某個店員不小心把店里的某兩個價格牌給掛倒了。并且這兩個價格牌的電視機都賣出去了!慶幸的是價格出入不大,其中一個價牌賠了2百多,另一個價牌卻賺了8百多,綜合起來,反而多賺了558元。請根據(jù)這些信息計算:賠錢的那個價牌正確的價格應(yīng)該是多少?
答案是一個4位的整數(shù),請通過瀏覽器直接提交該數(shù)字。
注意:不要提交解答過程,或其它輔助說明類的內(nèi)容。
代碼
#include <iostream> #include <sstream> #include <vector>using namespace std;void i2s(int num, string &str) {stringstream ss;ss << num;ss >> str; }void s2i(string &str, int &num) {stringstream ss;ss << str;ss >> num; }char to(char x) {if (x == '6')return '9';else if (x == '9')return '6';else return x; }string reverse(const string &str) {string ans;for (int i = 3; i >= 0; --i) {ans.insert(ans.end(), to(str[i]));}return ans; }struct price {int a, b, c;//原始價格,錯誤價格,差 }; vector<price> v1;//存儲-200多的 vector<price> v2;//存儲+800多的int main(int argc, const char *argv[]) { // cout<<reverse("1958")<<endl; // 枚舉所有四位數(shù)中可以顛倒的 //將其顛倒過來,與原來的數(shù)值做差,將-200多和+800的記錄下來,分別記錄在兩個集合中 //遍歷兩個集合將-+兩兩求和,結(jié)果為558的即為正確答案for (int i = 1000; i < 10000; ++i) {string str;i2s(i, str);if (str.find('3') != string::npos || str.find('4') != string::npos || str.find('7') != string::npos ||str.rfind('0') == 3)continue;string r = reverse(str);int r_int;s2i(r, r_int);//r_int就是翻轉(zhuǎn)后的價格,i是原始價格int plus = r_int - i;if (plus > -300 && plus < -200) {price p = {i, r_int, plus};v1.push_back(p);} else if (plus > 800 && plus < 900) {price p = {i, r_int, plus};v2.push_back(p);}// 此時,v1存儲了-200多的,v2存儲了+800多的for (int i = 0; i < v1.size(); ++i) {for (int j = 0; j < v2.size(); ++j) {if (v1[i].c + v2[j].c == 558) {printf("%d %d %d %d %d %d\n", v1[i].a, v1[i].b, v1[i].c, v2[j].a, v2[j].b, v2[j].c);}}}}return 0; }代碼分析
void i2s(int num, string &str) {stringstream ss;ss << num;ss >> str; }將整型數(shù)字轉(zhuǎn)換為字符串?dāng)?shù)字。
void s2i(string &str, int &num) {stringstream ss;ss << str;ss >> num; }將字符串類型的數(shù)字轉(zhuǎn)換為整型數(shù)字。
char to(char x) {if (x == '6')return '9';else if (x == '9')return '6';else return x; }判斷翻轉(zhuǎn)數(shù)字,1 2 5 6 8 9 0翻轉(zhuǎn)過來之后分別是1,2,5,9,8,6,0,所以只有6和9會變化。
string reverse(const string &str) {string ans;for (int i = 3; i >= 0; --i) {ans.insert(ans.end(), to(str[i]));}return ans; }建立一個新的字符串存儲翻轉(zhuǎn)之后的價格。
struct price {int a, b, c;//原始價格,錯誤價格,差 };存儲有翻轉(zhuǎn)效果的價格的原始價格,錯誤價格和差值。
vector<price> v1;//存儲-200多的 vector<price> v2;//存儲+800多的存儲題目需求的兩個價格。
int main(int argc, const char *argv[]) {for (int i = 1000; i < 10000; ++i) {//枚舉所有的四位數(shù)string str;i2s(i, str);//將i轉(zhuǎn)化為字符串if (str.find('3') != string::npos || str.find('4') != string::npos || str.find('7') != string::npos ||str.rfind('0') == 3)//如果在字符串中找到不能翻轉(zhuǎn)的數(shù)字直接跳過這個數(shù)continue;string r = reverse(str);//存儲翻轉(zhuǎn)之后的價格int r_int;s2i(r, r_int);//r_int就是翻轉(zhuǎn)后的價格,i是原始價格int plus = r_int - i;if (plus > -300 && plus < -200) {price p = {i, r_int, plus};v1.push_back(p);} else if (plus > 800 && plus < 900) {price p = {i, r_int, plus};v2.push_back(p);}for (int i = 0; i < v1.size(); ++i) {for (int j = 0; j < v2.size(); ++j) {if (v1[i].c + v2[j].c == 558) {printf("%d %d %d %d %d %d\n", v1[i].a, v1[i].b, v1[i].c, v2[j].a, v2[j].b, v2[j].c);}}}}return 0; }枚舉所有四位數(shù)中可以顛倒的
將其顛倒過來,與原來的數(shù)值做差,將-200多和+800的記錄下來,分別記錄在兩個集合中
遍歷兩個集合將-+兩兩求和,結(jié)果為558的即為正確答案。
簡單實現(xiàn)代碼
#include <iostream> #include <sstream> #include <cstring> #include <string> #include <cmath> using namespace std; void i2s(int &num,string &str) {stringstream ss;ss<<num;ss>>str; } void s2i(string &str,int &num) {stringstream ss;ss<<str;ss>>num; } int main () {int two[1000],eight[1000],k=0,l=0;memset(two,0,sizeof(two));memset(eight,0,sizeof(eight));for(int a=1000;a<10000;a++){int j;string s1,s2;i2s(a,s1);if(s1.find('3')!=string::npos||s1.find('4')!=string::npos||s1.find('7')!=string::npos)continue;for(int e=3;e>=0;e--){if(s1[e]=='6') s2.insert(s2.end(),'9');else if(s1[e]=='9') s2.insert(s2.end(),'6');else s2.insert(s2.end(),s1[e]);}s2i(s2,j);if(a-j>=200&&a-j<=300){ // cout<<a<<"翻轉(zhuǎn)之后"<<j<<" j-a="<<j-a<<endl;two[k]=j-a; // cout<<two[k]<<endl;if(k==21){cout<<a; // cout<<"k="<<k<<" two[k]="<<two[k]<<endl; // cout<<a<<"翻轉(zhuǎn)之后"<<j<<" j-a="<<j-a<<endl;}k++;} // if(j-a>=800&&j-a<=900) // { cout<<a<<"翻轉(zhuǎn)之后"<<j<<" j-a="<<j-a<<endl; // eight[l]=j-a; cout<<eight[l]<<endl; // if(l==0||l==3||l==4||l==7||l==8||l==11) // { // cout<<"l="<<l<<" eight[l]="<<eight[l]<<endl; // cout<<a<<"翻轉(zhuǎn)之后"<<j<<" j-a="<<j-a<<endl; // } // l++; // }} // cout<<endl; // for(int a=0;a<=k;a++) // { // for(int b=0;b<=l;b++) // { // if(two[a]+eight[b]==558) // { // cout<<"two["<<a<<"]+eight["<<b<<"]="<<two[a]+eight[b]<<endl; // } // } // }return 0; }9088
總結(jié)
以上是生活随笔為你收集整理的征战蓝桥 —— 2013年第四届 —— C/C++A组第4题——颠倒的价牌的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 征战蓝桥 —— 2013年第四届 ——
- 下一篇: 征战蓝桥 —— 2013年第四届 ——