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
题意:输入一个整数(不超过20位),将其乘以2得到一个新整数,若新整数的数位是原整数的数位的一个排列,那么输出“Yes”,反之输出“No”,下一行都需要输出新整数。
ps. 虽然写过高精度计算的题,但是看了算法笔记后发现以前写的很不规范,将处理格式规范化以后方法和思路会清晰很多。具体看代码。
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
struct bign
{
int d[25]; //bign的每一位,从个位开始
int len; //bign的长度
bign() //对bign进行初始化,len为0,bign每一位为0
{
memset(d,0,sizeof(d));
len=0;
}
};
bign change(string s) //将输入的字符串转化为bign
{
bign a;
for(int i=s.length()-1;i>=0;i--) //bign从个位开始,所以倒序赋值
a.d[a.len++]=s[i]-'0';
return a;
}
void print(bign n) //输出bign
{
for(int i=n.len-1;i>=0;i--) //bign从个位开始,所以倒序输出
cout<<n.d[i];
}
bign Double(bign n) //bign*2的操作
{
bign a;
int i,t,carry=0; //carry代表进位
for(i=0;i<n.len;i++)
{
t=2*n.d[i]+carry;
a.d[a.len++]=t%10;
carry=t/10;
}
if(carry) //如果carry不为0
a.d[a.len++]=carry;
return a;
}
int main()
{
string t;
bign N;
int i,cnt1[10]={0},cnt2[10]={0}; //利用cnt1[10]和cnt2[10]来判断 Yes/No
cin>>t;
N=change(t);
for(i=0;i<N.len;i++)
cnt1[N.d[i]]++;
N=Double(N);
for(i=0;i<N.len;i++)
cnt2[N.d[i]]++;
for(i=0;i<=9;i++)
{
if(cnt1[i]!=cnt2[i])
{
cout<<"No"<<endl;
print(N);
return 0;
}
}
cout<<"Yes"<<endl;
print(N);
return 0;
}