题目大意
请注意,数字123456789是9位数字,完全由1到9组成,没有重复。将其加倍,我们将获得246913578,它恰好是另一个9位数字,恰好由1到9组成,只是排列不同。如果再次将其加倍,请检查结果! 现在,您应该检查此属性是否还有更多的数字。也就是说,将给定数字与k位数字加倍,就可以知道结果数是否仅由原始数字中的数字排列组成。
解题方法
刚拿到题目发现是一个大数,因此使用string来存储数据,并进行适当的操作
- 每个字符的出现次数使用了map存储,后发现使用到的只有0-9,因此完全可以通过长度为10的数组保存。
- 注意对题的理解,不是是只要出现即可,而且出现的次数也必须得到保证。
#include<bits/stdc++.h>
using namespace std;
string strOrgin;
string douStrOrgin;
map<char, int> myMap;
string doubleNum(string& str) {
string res;
int fa = 0, tem, size = str.size();
for (int i = size - 1; i >= 0; i--) {
map<char, int>::iterator iter;
iter = myMap.find(str[i]);
if (iter == myMap.end())
myMap.emplace(str[i], 1);
else
iter->second++;
tem = str[i] - '0';//字符转化为数字
res.push_back(char((tem* 2 + fa) % 10 + '0'));//本位
fa = (tem * 2 + fa) / 10;//进位
}
if (fa != 0)
res.push_back(char(fa + '0'));
reverse(res.begin(), res.end());
return res;
}
int main() {
cin >> strOrgin;
douStrOrgin = doubleNum(strOrgin);
map<char, int>::iterator iter;
for (unsigned int i = 0; i < douStrOrgin.size(); i++) {
iter = myMap.find(douStrOrgin[i]);
if (iter == myMap.end()) {
cout << "No" << endl;
cout << douStrOrgin;
return 0;
}
else
iter->second--;
}
for (iter = myMap.begin(); iter != myMap.end(); iter++) {
if (iter->second != 0) {
cout << "No" << endl;
cout << douStrOrgin;
return 0;
}
}
cout << "Yes" << endl;
cout << douStrOrgin;
return 0;
}
柳神代码
#include <cstdio>
#include <string.h>
using namespace std;
int book[10];
int main() {
char num[22];
scanf("%s", num);
int flag = 0, len = strlen(num);
for(int i = len - 1; i >= 0; i--) {
int temp = num[i] - '0';
book[temp]++;
temp = temp * 2 + flag;
flag = 0;
if(temp >= 10) {
temp = temp - 10;
flag = 1;
}
num[i] = (temp + '0');
book[temp]--;
}
int flag1 = 0;
for(int i = 0; i < 10; i++) {
if(book[i] != 0)
flag1 = 1;
}
printf("%s", (flag == 1 || flag1 == 1) ? "No\n" : "Yes\n");
if(flag == 1) printf("1");
printf("%s", num);
return 0;
}