PAT甲級_1023(Have Fun with Numbers)

1023 數字樂趣

公告,數字123456789是一個由1~9的9個沒有重複數字組成的9位數。將它翻倍我們將得到246913578,這恰好也是一個由1–9的9個沒有重複數字組成的9位數,只是兩者的排列方式不同。
現在你應該檢查是否有更多具有這個屬性的數字。即,對於一個給定的數字K,將它乘以2後得到的結果是否是隻包含原始數字中的數字的排列。

輸入規範

每個輸入包含一個測試用例,每個用例包含一個不超過20位數字的正整數。

輸出規範

對於每個測試用例,如果輸入數字加倍得到的數字僅由原始數字的排列組成,則在第一行中打印“Yes”,否則打印“No”。然後在下一行,打印源數字加倍後的數字。

輸入樣例
1234567899
輸出樣例
Yes
2469135798
解題思路

高精度加法。點擊跳轉C++高精度模板

AC代碼
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int cnt[10];
//加法
vector<int> add(vector<int> &A, vector<int> &B) {   
   vector<int> C; //保存答案,依然是從各位開始保存
   //t保存進位
   for(int i = 0, t = 0; i < A.size() || i < B.size() || t; i++) {
    //或t的作用是方便最後進位保存至結果中
       if(i < A.size()) {
           t += A[i];
       }
       if(i < B.size()) {
           t += B[i];
       }
       C.push_back(t % 10);    //壓入本位數字
       t /= 10;    //計算進位
   }
   return C;
}
int main() {
    string str;
    cin >> str;
    vector<int> vt;
    for(int i = str.size() - 1; i >= 0; i--) {
        vt.push_back(str[i]-'0');
        cnt[str[i]-'0']++;      //記錄原始數字個數
    }
    
    vector<int> res = add(vt, vt);          //翻倍
    //查看翻倍數字是否是原始數字重新排序得到
    for(int i = 0; i < res.size(); i++) {   
        cnt[res[i]]--;
    }
    bool sign = true;           //true表示是
    for(int i = 0; i < 10; i++) {
        if(cnt[i] != 0) {
            sign = false;
            break;
        }
    }
    if(sign) {
        cout << "Yes" << endl;
    }else {
        cout << "No" << endl;
    }
    for(int i = res.size() - 1; i >= 0; i--) {      //輸出翻倍後數字
        cout << res[i];
    }
    cout << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章