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 file 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
生词
英文 | 解释 |
---|---|
duplication | 重复 |
permutation | 排列 |
property | 特性 |
题目大意:
给出一个长度不超过20的整数,问这个整数两倍后的数位是否为原数位的一个排列。不管是yes还是no最后都要输出整数乘以2的结果
分析:
使用char数组存储这个数,没个数的数位乘以2 + 进位,同时设立book来标记数位出现的情况。只有最后book的每个元素都是0的时候才说明这两个数字是相等的一个排列结果~
原文链接:https://blog.csdn.net/liuchuo/article/details/52155928
题解
#include <bits/stdc++.h>
using namespace std;
int book[10];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int flag=0;
char num[20];
scanf("%s",num);
for(int i=strlen(num)-1;i>=0;i--){
int temp=num[i]-'0';
book[temp]++;
temp=temp*2+flag;
//没有产生进位需要重新赋值为0
//否则flag一直是1
flag=0;
if(temp>=10){
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",(flag1==1||flag==1)?"No
":"Yes
");
if(flag==1) printf("1");
printf("%s",num);
return 0;
}