c++程式設計線上筆試中遇到多個輸入時的處理案例
阿新 • • 發佈:2019-01-31
1,問題描述。
洗牌在生活中十分常見,現在需要寫一個程式模擬洗牌的過程。 現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張(上半堆),右手拿著第n+1張到第2n張(下半堆)。接著就開始洗牌的過程,先放下右手的最後一張牌,再放下左手的最後一張牌,接著放下右手的倒數第二張牌,再放下左手的倒數第二張牌,直到最後放下左手的第一張牌。接著把牌合併起來就可以了。 例如有6張牌,最開始牌的序列是1,2,3,4,5,6。首先分成兩組,左手拿著1,2,3;右手拿著4,5,6。在洗牌過程中按順序放下了6,3,5,2,4,1。把這六張牌再次合成一組牌之後,我們按照從上往下的順序看這組牌,就變成了序列1,4,2,5,3,6。 現在給出一個原始牌組,請輸出這副牌洗牌k次之後從上往下的序列。
輸入描述:
第一行一個數T(T ≤ 100),表示資料組數。對於每組資料,第一行兩個數n,k(1 ≤ n,k ≤ 100),接下來一行有2n個數a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌組從上到下的序列。
輸出描述:
對於每組資料,輸出一行,最終的序列。數字之間用空格隔開,不要在行末輸出多餘的空格。
輸入例子:
3 3 1 1 2 3 4 5 6 3 2 1 2 3 4 5 6 2 2 1 1 1 1
輸出例子:
1 4 2 5 3 6 1 5 4 3 2 6 1 1 1 12,怎麼輸入呢?
對只需要一次輸入的資料,直接cin它,比如輸入例子中的第一行數3,對需要多次輸入的形式相同的資料,用迴圈輸入方式輸入。
比如輸入例子中的第二行和第三行可看成一組資料,下邊的資料都是這一組資料形式的重複輸入。所以可迴圈輸入。
3,怎麼輸出呢?
既然有多次相同形式的資料輸入,所以在每一組資料輸入後,就直接處理,然後輸出。
具體程式碼:
#include <iostream> using namespace std; void sorting(int *a,int length) { if (a == NULL || length <= 0)return; int *L = new int[length/2]; int *R = new int[length/2]; for (int i = 0; i < length/2; ++i) { L[i] = a[i]; } for (int i = length/2; i < length; ++i) { R[i - length/2] = a[i]; } for (int i = 0, j = 0; i < length/2 && j < length; ++i,j = j + 2) { a[j] = L[i]; a[j+1] = R[i]; } } void Ksort() { int T; cin >> T;//一個數據,直接輸入 int n, k; while (cin >> n){//while迴圈執行一次就是輸入一組資料,然後對這組資料處理,輸出結果 cin >> k; int *a = new int[2*n]; for (int i = 0; i < 2*n; ++i) { cin >> a[i]; } for (int i = 0; i < k; ++i) { sorting(a, 2*n); } for (int i = 0; i < 2*n - 1; ++i)//注意輸出結果的格式 { cout << a[i] << ' '; } cout << a[2*n - 1]; cout << endl; } } int main()//注意main函式的書寫 { Ksort(); return 0; }
以後遇到新的輸入格式,再補充!!