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
大数乘法
判断原来的数字N和2*N的构成数字是否相同:将各位数字排序,如果结果相同,就是Yes。
#include <iostream>
using namespace std;
#include <cstring>
#include <algorithm>
int main(){
char num[21];
cin>>num;
int n=strlen(num);
int dup[21]={0};
int g=0;
for(int i=n-1,k=0;i>=0;i--,k++){
int temp=2*(num[i]-'0');
dup[k]=g+temp%10;
g=temp/10;
}
dup[n]=g;
int num1[21]={0},dup1[21]={0};
for(int i=0;i<n;i++) {
num1[i]=num[i]-'0';
dup1[i]=dup[i];
}
sort(num1,num1+n);
sort(dup1,dup1+n);
int flag=1;
for(int i=0;i<n;i++){
int d=num1[i]-dup1[i];
if(d!=0) flag=0;
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
if(dup[n]) cout<<dup[n];
for(int i=n-1;i>=0;i--){
cout<<dup[i];
}
return 0;
}