我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805478658260992
题目描述:
题目翻译:
1023 和数字玩得开心
请注意,数字123456789是一个9位数字,由1到9的数字组成,没有重复。 双倍它我们将获得246913578,这恰好是另一个9位数字,由1到9的数字组成,只是排列不同。 尝试着看看再次加倍的结果!
现在你要检查是否有更多数字满足此性质。 也就是说,给定一个k位数,你要判断结果数字加倍后的结果是否只包含原始数字中数字的排列。
输入格式:
每个输入文件包含一个测试用以。每个测试用例给出一个不超过20位的正整数。
输出格式:
对每个测试用例,如果加倍输入后的数字只是原数字的每一位数的不同的排列,输出“Yes”,否则输出“No”。然后在下一行输出翻倍后的数字。
输入样例:
1234567899
输出样例:
Yes
2469135798
知识点:大数加法
思路:字符串加法
时间复杂度是O(n),其中n为输入正整数的位数。
C++代码:
#include<iostream>
#include<string>
using namespace std;
string reverse(string s);
string add(string s1, string s2);
bool judge(string s1, string s2);
int main() {
string input;
cin >> input;
string sum = add(input, input);
if(judge(input, sum)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
cout << sum << endl;
return 0;
}
string reverse(string s) {
string result = "";
for(int i = s.length() - 1; i >= 0; i--) {
result += s[i];
}
return result;
}
string add(string s1, string s2) {
int flag = 0;
s1 = reverse(s1);
s2 = reverse(s2);
string result = "";
int index1 = 0;
int index2 = 0;
while(true) {
if(index1 >= s1.length() && index2 >= s2.length()) {
if(flag != 0) {
result += flag + '0';
}
break;
} else {
int num = s1[index1] - '0' + s2[index2] - '0' + flag;
if(num >= 10) {
num -= 10;
flag = 1;
} else {
flag = 0;
}
result += num + '0';
index1++;
index2++;
}
}
return reverse(result);
}
bool judge(string s1, string s2) {
int count1[10]; //count1[i]表示s1字符串中字符i出现的次数
fill(count1, count1 + 10, 0);
for(int i = 0; i < s1.length(); i++) {
count1[s1[i] - '0']++;
}
int count2[10]; //count2[i]表示s2字符串中字符i出现的次数
fill(count2, count2 + 10, 0);
for(int i = 0; i < s2.length(); i++) {
count2[s2[i] - '0']++;
}
for(int i = 0; i < 10; i++) {
if(count1[i] != count2[i]) {
return false;
}
}
return true;
}
C++解题报告: