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
考点
- 基本的数据处理
题解
- 由于unsigned long long int 最大20位,所以不能直接使用int型,利用char数组存取。
- 2个reverse使char数组翻转成方便处理和输出的样式。
笔记
- printf unsigned long long int用%llu
- strlen的头文件是string.h
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=20+2;
char in[maxn];
int first[10],second[10];
void parse(int num[]){
int i=0;
while(in[i]!='\0'){
++num[in[i]-'0'];
++i;
}
}
bool cmp(){
for(int i=0;i<10;i++){
if(first[i]!=second[i])return false;
}
return true;
}
int main(){
scanf("%s",in);
parse(first);
reverse(in,in+strlen(in));
int i;
int add=0;
for(i=0;i<strlen(in);i++){
add+=(in[i]-'0')*2;
in[i]=add%10+'0';
add/=10;
}
if(add!=0){
in[i]=add+'0';
in[i+1]='\0';
}
parse(second);
reverse(in,in+strlen(in));
if(cmp()){
printf("Yes\n");
}else{
printf("No\n");
}
printf("%s",in);
}