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
题目大意:对于给定的数字(不超过20位),将其乘以2,判断结果的数字是否和原来数字的排列一致。一致输出Yes,不一致输出No。
无论一不一致,均输出乘以2后的结果。
注释写的比较清晰,这里不做过多解释了
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
//num存放读入的数字,ans存放*2后结果,tmp存放临时排序用的数组
char num[21], ans[21] = {0}, tmp[21];
cin >> num;
//jinwei存放进位,len存放长度
int jinwei= 0, len = strlen(num);
for(int i = len - 1; i >= 0; i--){
int n = num[i] - '0';
n = n * 2 + jinwei;
jinwei = n / 10;
ans[i] = n % 10 + '0';
}
//最后仍有进位,排列一定不一样
if(jinwei)
cout << "No" << endl << jinwei;
else{
//排序然后判断两个串是否一样
strcpy(tmp, ans);
sort(tmp, tmp + len);
sort(num, num + len);
if(!strcmp(tmp, num)) cout << "Yes" << endl;
else cout << "No" << endl;
}
cout << ans;
return 0;
}