現在給您 N 個整數,請依他們每個位數之和由小到大排序,若每個位數之和相同,則依整數本身的數值由小到大排序。
假設現在有 3 個正整數 1234、1258、5122,正整數 1234,它的每個位數的相加為1 +. 2 + 3 + 4 = 10;1258 為 16;5122 為 10。所以排序結果為 1234、5122、1258。
範例測資
範例輸入 | 範例輸出 |
---|---|
第一行是一個正整數 T (1 ≤ T ≤ 10) 代表測試資料有幾筆。 每一筆測試資料共 2 行。第一行是一個正整數 N (2 ≤ N ≤ 10),其代表共有 N 個正整數。接著第二行包含了 N 個整數,每個整數用空白隔開,每個數字的位數是 3 到 7。 | 請依排序規則,輸出每筆測試資料的排序結果。 每行輸出最後必有換行符號。 |
5 3 1234 1258 5122 4 1725 3821 2011 1428 4 1925 2011 3210 9215 4 4145 1245 1485 1478 7 5584 12635 7894 12365 98453 56487 2134567 | 1234 5122 1258 2011 3821 1428 1725 2011 3210 1925 9215 1245 4145 1485 1478 12365 12635 5584 7894 2134567 98453 56487 |
解題思路
收資料的時候可以使用字串的方式收資料,然後跑 For迴圈 將每一個位數的數字進行相加。
宣告一個 Vector<pair<int, int>> 用來排序,因為會有位數總和相同的情況,這樣的情況下就是原本的數字較小就先輸出。將位數總和放在 Pair 的第一個欄位,原本的字串使用 stoi 轉為數字之後放在第二個欄位,並 Push_Back 到 Vector 中,之後就是 sort 了。
輸出的時候只需要將每一個 Pair 的 second 欄位輸出即可,需要注意的是最後一個資料後面是不能有空格的,要直接換行,所以可以在輸出的 For迴圈 內用判斷式判斷目前跑到的數字是否為 N-1。
範例程式碼-ITSA 202405 #4:特殊的排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
cout.sync_with_stdio(0);
cout.tie(0);
int T;
cin >> T;
for (int i = 0; i<T; i++) {
int N;
cin >> N;
vector<pair<int, int>>v;
for (int j = 0; j<N; j++) {
string str;
cin >> str;
int sum = 0;
for (int k = 0; k<str.length(); k++) sum += str[k] - '0';
pair<int, int>p;
p.first = sum;
p.second = stoi(str);
v.push_back(p);
}
sort(v.begin(), v.end());
for (int j = 0; j<N; j++) {
cout << v[j].second;
if (j != N-1) cout << " ";
}
cout << "\n";
}
}
//ITSA 202405 #4
//Dr. SeanXD