题目
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
直接模拟,统计一下前后各个字符数量是否相等就可以了。
代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i;
int digit[10]={0},dig_double[10]={0}; //统计各个数字的数量
int carry=0; //进位标记
char dig;
string num,num_double; //初始数,翻倍的数
cin>>num;
for(i=0;i<num.size();i++) //统计初始数的各个数字的数量
digit[num[i]-'0']++;
for(i=num.size()-1;i>=0;i--) //翻倍
{
dig=((num[i]-'0')*2+carry)%10+'0';
carry=((num[i]-'0')*2+carry)/10;
num_double.insert(num_double.begin(),dig);
}
if(carry==1) //如果最后有进位
num_double.insert(num_double.begin(),'1');
for(i=0;i<num_double.size();i++) //统计翻倍后的各个数字数
dig_double[num_double[i]-'0']++;
for(i=0;i<10;i++) //比较各个数字数是否相同
if(digit[i]!=dig_double[i])
{
cout<<"No"<<endl;
cout<<num_double;
return 0;
}
cout<<"Yes"<<endl;
cout<<num_double;
return 0;
}