A1023. Have Fun with Numbers (20)

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
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <iostream>
  4 #include <string.h>
  5 #include <string>
  6 #include <math.h>
  7 #include <algorithm>
  8 using namespace std;
  9 
 10 struct bign
 11 {
 12     int d[1010];
 13     int len;
 14     bign(){
 15         memset(d,0,sizeof(d));
 16         len=0;
 17     }
 18 };
 19 
 20 bign change(char str[]){
 21     bign a;
 22     a.len=strlen(str);
 23     for(int i=0;i<a.len;i++)
 24     {
 25         a.d[i]=str[a.len-i-1]-'0';
 26     }
 27     return a;
 28 }
 29 
 30 bign divide(bign a,int b,int & r)
 31 {
 32     bign c;
 33     c.len=a.len;
 34     for(int i=a.len-1;i>=0;i--)
 35     {
 36          r=10*r+a.d[i];
 37          if(r<b)c.d[i]=0;
 38          else
 39          {
 40           c.d[i]=r/b;
 41           r=r%b;    
 42          }    
 43     }
 44     while(c.len-1>0&&c.d[c.len-1]==0)
 45     {
 46         c.len--;
 47     }
 48     return c;
 49 }
 50 
 51 
 52 bign multi(bign a,int b)
 53 {
 54     bign c;
 55     int carry=0;
 56     for(int i=0;i<a.len;i++)
 57     {
 58         int temp;
 59         temp=a.d[i]*b+carry;
 60         carry=temp/10;
 61         c.d[c.len++]=temp%10;
 62     }
 63     //乘法高位处理
 64     while(carry!=0)
 65     {
 66         c.d[c.len++]=carry%10;
 67         carry/=10; 
 68     }
 69     return c;
 70 }
 71 
 72 void print(bign a)
 73 {
 74   for(int i=a.len-1;i>=0;i--)
 75   {
 76       printf("%d",a.d[i]);
 77   }    
 78 }
 79 
 80 bool judge(bign a ,bign b)
 81 {
 82     if(a.len!=b.len)return false;
 83     int count[10]={0};
 84     for(int i=0;i<a.len;i++ )
 85     {
 86         count[a.d[i]]++;
 87         count[b.d[i]]--;
 88     }
 89     for(int i=0;i<10;i++)
 90     {
 91         if(count[i]!=0)return false;
 92     }
 93     return true;
 94 }
 95 int main(){
 96     char str[21];
 97     scanf("%s",str);
 98     bign a=change(str);
 99     bign b=multi(a,2);
100     if(judge(a,b)==false)
101     {
102         printf("No
");
103     } else
104     {
105         printf("Yes
");
106     }
107     print(b);
108     return 0;
109 }
原文地址:https://www.cnblogs.com/ligen/p/4304290.html