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 a
re 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
#include <bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> &A)//高精度乘法(乘2)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||t;i++)//相乘之后,位数可能增加
{
if(i<A.size()) t+=A[i]*2;
C.push_back(t%10);
t/=10;
}
return C;
}
int main()
{
//freopen("D:\\LYJ.txt","r",stdin);//用文件输入
string s;
vector<int> A(10,0),M(10,0),B,C;
//A,M标记数字个数(数字为下标),B为输入的数 C为输出的数
getline(cin, s); // 读取?一?行行的字符串串,包括空格
for(int i=s.length()-1;i>=0;i--)
{
int flag=s[i]-'0';
B.push_back(flag);//字符串倒序转为int
A[flag]++;
}
C=mul(B);
for(int i=0;i<C.size();i++)
{
M[C[i]]++;
}
int ret=0;
for(int i=0;i<=9;i++)
{
if(A[i]!=M[i])
{
ret=1;
break;
}
}
//cout<<s.length()<<" "<<A.size()<<" "<<M.size()<<" "<<B.size()<<" "<<C.size()<<endl;
if(0==ret) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
for(int i=C.size()-1;i>=0;i--)
{
cout<<C[i];
}
return 0;
}