PAT甲級_1120(Friend Numbers)

1120 友元數字

如果兩個數字共享相同的數字和,那麼這兩個數字就被叫做“友元數字”,這個和就是它們的“友元ID”。例如:123和51是“友元數字”,因爲1+2+3 = 5+1 = 6,其中6就是它們的"友元ID"。給定一些數字,你應該找到其中不同的“友元ID”的數量。

輸入規範

每個輸入文件包含一個測試用例。每個用例的第一行包含一個正整數N。接下來一行給出N個用空格分隔的正整數。所有的數字不超過104

輸出規範

對於每個用例,在第一行打印給定整數中不同“友元ID”的個數。然後再第二行按照遞增的順序輸出“友元ID”。數字之間必須精確的用一個空格隔開,並且在一行的結尾沒有多餘的空格。

樣例輸入
8
123 899 51 998 27 33 36 12
樣例輸出
4
3 6 9 26
解題思路

這道題我開始翻譯的時候感覺有個歧義,開始以爲“友元ID”至少是擁有兩個數字和是這個的數字,但其實並不是。這題通俗的說只是求序列中各位數字和的所有不同情況,然後按嚴格遞增排序輸出。
可以使用set容器,這樣會使代碼更加簡便。但是本篇文章用的是將所有數字和求出來後,進行排序,然後再去重。

AC代碼
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int sum(int n) {    //求解n的各位數字和
    int t = 0;      //記錄各位數字和
    while(n) {
        t += n % 10;
        n /= 10;
    }
    return t;
}
int main() {
    int n;
    cin >> n;
    vector<int> vt;     //保存n個數字的各位數字和
    for(int i = 0; i < n; i++) {
        int x;
        cin >> x; 
        vt.push_back(sum(x));
    }
    
    sort(vt.begin(), vt.end());
    //去重
    int cnt = 1;        //記錄不重複的ID個數
    for(int i = 0; i < n;) {
        int j = i+1;
        while(j < n && vt[i] == vt[j]) {
            j++;
        }
        vt[cnt] = vt[j];
        i = j;
        cnt++;
    }
    cnt--;      
    cout << cnt << endl;
    for(int i = 0; i < cnt-1; i++) {
        cout << vt[i] << ' ';
    }
    cout << vt[cnt-1] << endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章