题目
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.
Sample Input:
1234567899
Sample Output:
Yes
2469135798
Solution:
问,一个数的double后,是不是还是由原来的数字组成的?
说白了就是问,一个数加上自己是不是自己的一个排列?
使用nums[10]来记录原来的数的各个数字出现的次数,然后与其和对比
或者直接排序后对比是不是一样的
注意:大数运算, 用字符实现加减
Code
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s1, s2, s3;
cin >> s1;
s2 = s1;
int temp, index = 0;
for (int i = s1.length()-1; i >= 0; i--)
{
temp = s1[i] - '0' + s1[i] - '0' + index;
s2[i] = temp % 10 + '0';
index = temp / 10;
}
if (index > 0)
s2.insert(s2.begin(), index + '0');
s3 = s2;
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
if (index > 0 || s1 != s2)
cout << "No" << endl;
else
cout << "Yes" << endl;
cout << s3 << endl;
return 0;
}