您的位置:首页 > 其它

1023. Have Fun with Numbers (20)

2016-02-23 10:08 357 查看
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.h>
using namespace std;
int cnt[10]={0};
struct bign{
int d[30];
int len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
};
bign setbign(char str[]){
bign a;
a.len=strlen(str);
for(int i=0;i<a.len;i++){
a.d[i]=str[a.len-i-1]-'0';
}
return a;
}
bign doub(bign a){
int r=0;
for(int i=0;i<a.len||r!=0;i++){
a.d[i]=a.d[i]*2+r;
r=0;
while(a.d[i]>=10){
r++;
a.d[i]-=10;
}
}
for(int i=a.len;a.d[i]!=0;i++){
a.len++;
}
return a;
}
void print(bign a){
for(int i=a.len-1;i>=0;i--)
cout<<a.d[i];
}
int main(){
freopen("in.txt","r",stdin);
char str[30];
cin>>str;
bign a=setbign(str);
bign b=doub(a);
bool flag=true;
for(int i=0;i<a.len;i++){
cnt[a.d[i]]++;
cnt[b.d[i]]--;
}
if(a.len!=b.len) flag=false;
else{
for(int i=0;i<10;i++)
if(cnt[i]) flag=false;
}
if(flag){
printf("Yes\n");
}
else printf("No\n");
print(b);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: