一道有趣的題——如何把聯絡方式以程式碼的形式告訴別人
阿新 • • 發佈:2018-12-11
先來看這道題。
出租 (20 分)
題目描述:
下面是新浪微博上曾經很火的一張圖:
本題要求你編寫一個程式,為任何一個電話號碼生成這段程式碼 —— 事實上,只要生成最前面兩行就可以了,後面內容是不變的。
輸入格式:
輸入在一行中給出一個由11位數字組成的手機號碼。
輸出格式:
為輸入的號碼生成程式碼的前兩行,其中arr
中的數字必須按遞減順序給出。
輸入樣例:
18013820100
輸出樣例:
int[] arr = new int[]{8,3,2,1,0}; int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
解題思路:
其實圖片中的這段程式碼很簡單,index
陣列就是arr
陣列的下標,index[0]=2
對應 arr[2]=1
,index[1]=0
對應 arr[0]=8
,index[2]=3
對應 arr[3]=0
,以此類推…… 很容易得到電話號碼是18013820100
。
AC程式碼:
#include <bits/stdc++.h> using namespace std; #define up(i,a,b) for(int i=a;i<=b;i++) //巨集定義一個for迴圈 #define down(i,a,b) for(int i=b;i>=a;i--) //巨集定義一個for迴圈 bool Cmp(int a,int b) //在使用sort時增加的一個比較函式 { return a>b; //降序排列 若為(a<b),升序排列 } int main() { std::ios_base::sync_with_stdio(false); //解除cin與stdin同步佔用的時間 string s; cin >> s; int arr[11]; int index[11]; up(i,0,s.length()-1) { arr[i] = s[i]-'0'; } sort(arr,arr+11,Cmp); int len = unique(arr,arr+11)-arr; //unique是去重函式,去除相鄰元素重複的數值(只保留一個),事實上unique的去除並不是真正意義上的刪除,而是將重複的元素移動到陣列的後面 up(i,0,10) //在arr陣列中尋找s中的元素, { up(j,0,len-1) { if(s[i]-'0' == arr[j]) { index[i] = j; //找到之後將arr中元素的表賦值給新的陣列儲存數值 } } } cout<<"int[] arr = new int[]{"; //輸出表達式 up(i,0,len-1) { if(i != len-1) { cout << arr[i] << ","; } else { cout << arr[i] << "};" << endl; } } cout << "int[] index = new int[]{"; up(j,0,10) { if(j != 10) { cout << index[j] << ","; } else { cout << index[j] << "};" << endl; } } return 0; }
執行程式後,輸入手機號即可得到相應的index和arr陣列,然後再把它們寫成類似題目給出的圖片中的程式碼段。