题目描述:
数字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;
}