题目描述
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.
输入描述:
Each input file contains one test case. Each case contains one positive integer with no more than 20 digits.
输出描述:
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.
输入例子:
1234567899
输出例子:
Yes
2469135798
// pat.cpp : 定义控制台应用程序的入口点。
//
// pat.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include"stdio.h"
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<math.h>
using namespace std;
const int maxn=10010;
string s;
struct bign{
int d[30];
int len;
bign(){len=0;}
};
bign change(string str){
bign b;
for(int i=0;i<str.length();i++)
b.d[i]=str[str.length()-1-i]-'0';
b.len=s.length();
return b;
}
bign mul(bign b,int a){
bign c;int h=0;
for(int i=0;i<b.len;i++)
{h=b.d[i]*a+h;
c.d[c.len++]=h%10;
h/=10;
}
while(h){
c.d[c.len++]=h%10;
h/=10;
}
return c;
}
int hashtable[10]={0};
int main(){
// freopen("c://jin.txt","r",stdin);
cin>>s;
bign b=change(s);
bign c=mul(b,2);
for(int i=0;i<b.len;i++){
hashtable[b.d[i]]++;
}
for(int i=0;i<c.len;i++)
hashtable[c.d[i]]--;
int i;
for(i=0;i<=9;i++)
if(hashtable[i]!=0)break;
if(i!=10){
cout<<"No"<<endl;
}
else {cout<<"Yes"<<endl;
}
for(int i=c.len-1;i>=0;i--)
cout<<c.d[i];
// freopen("CON","r",stdin);
// system("pause");
return 0;
}