PAT甲级 1023
题目 Have Fun with Numbers
Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!
Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.
Input Specification:
Each input contains one test case. Each case contains one positive integer with no more than 20 digits.
Output Specification:
For each test case, first print in a line “Yes” if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or “No” if not. Then in the next line, print the doubled number.
解析
输入一个小于20位的数,求2倍后的序列是有原序列构成的。
代码
#include<bits/stdc++.h>
#define INF 1<<29
using namespace std;
string num;
int num_n[10];
int num_n2[10];
string dou(string num);
void pat1023() {
memset(num_n, 0, sizeof(num_n));
memset(num_n2, 0, sizeof(num_n2));
cin >> num;
for (int i = 0; i < num.size(); ++i) {
int t;
stringstream ss;
ss<<num[i];
ss>>t;
num_n[t]++;
}
string num2 = dou(num);
for (int i = 0; i < num2.size(); ++i) {
int t;
stringstream ss;
ss<<num2[i];
ss>>t;
num_n2[t]++;
}
bool flag = true;
for (int i = 0; i < 10; ++i) {
if (num_n[i] != num_n2[i]) {
flag = false;
break;
}
}
if (flag) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
cout << num2 << endl;
}
string dou(string num) {
string res;
int carry = 0;
for (int i = num.size() - 1; i >= 0; --i) {
int t;
stringstream ss;
ss << num[i];
ss >> t;
t = t * 2 + carry;
carry = t / 10;
t = t % 10;
res += to_string(t);
}
if (carry != 0) {
res += to_string(carry);
}
reverse(res.begin(), res.end());
return res;
}
int main() {
pat1023();
return 0;
}