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 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
大意是输入一个数字num1,判断num1*2之后的结果num2中各位上的数是不是由num1各位上的数组成,若是输出“Yes”,不是输出“No”,不管是或不是都要在第二行输出num2。
思路:用字符串存储num1,在将字符串转换成数组,从后向前计算,结果存到另一个数组,两个数组都sort一下,判断各位上数字是否相同。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str1;
cin>>str1;
int num = str1.length();//字符长度,即数字个数
int num_str1[num];//原数字
int num_str2[num],num_temp[num];//计算后的数字
int temp=0;//要进位的数
//计算num2
for(int i=str1.length()-1; i>=0; i--)
{
num_str1[i]=str1[i]-'0';
num_temp[i]=num_str2[i]=(num_str1[i]*2+temp)%10;
temp = (num_str1[i]*2)/10;
}
if(temp!=0)
{
cout<<"No"<<endl;
cout<<temp;
}
else
{
sort(num_str1,num_str1+num);
sort(num_temp,num_temp+num);
int flag = 0;
for(int i=0; i<num; i++)
{
if(num_str1[i]!=num_temp[i])
{
flag = 1;
cout<<"No"<<endl;
break;
}
}
if(flag == 0)
cout<<"Yes"<<endl;
}
for(int i=0; i<num; i++)
cout<<num_str2[i];
}