【PAT_1023】Have Fun with Numbers

2018-07-31  本文已影响0人  6J

题目描述:

数字123456789是一个9位数字,由1到9的数字组成,没有重复。 双倍它我们将获得246913578,这恰好是另一个9位数字,由1到9的数字组成,只是在不同的排列中。现在您要检查有更多此属性数字。,给定数字加倍k个后判断结果数字是否是只包含原始数字中数字的排列。

输入

一个位数不超过20位的正整数nums

输出

第一行:数字加倍后如果是只包含原始数字中的数字的排列则输出Yes否则输出No

第二行:输出nums*2的结果

思路

用一个string存储这个整数nums,并用map映射其中每个数字的个数。然后将每个数位*2+进位得到结果数,同时将map中的该数的value减一。只有到最后map的为空时,这两个数字是相等的一个排列

#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
int main() {
        string s;
        cin >> s;
        map<char, int>start;
        bool flag = true;
        int carry = 0,temp;
        for (int i = 0; i < s.size(); i++) {
            if (start.find(s[i]) == start.end()) {
                start.insert(pair<char, int>(s[i], 1));
            }
            else {
                start[s[i]]++;
            }
        }
        char c;
        vector<char>datas;
        for (int i = s.size() - 1; i >= 0;i--) {
            temp = (s[i] - '0') * 2 + carry;
            carry = temp / 10;
            c = temp % 10+'0';
            if(flag){
            if (start.find(c) == start.end()) {
              flag=false;
            }else {
                start[c]--;
                if(start[c]==0)start.erase(c);
            }
            }
            datas.push_back(c);
        }
        if(carry!=0){
          flag = false;
      datas.push_back(carry+'0');
    }
        if (!flag)cout << "No"<<endl;
        else { cout << "Yes"<<endl; }
        for (int i = datas.size() - 1; i >= 0; i--) {
            cout << datas[i];
        }
        return 0;
}

image.gif
上一篇 下一篇

猜你喜欢

热点阅读