1023. 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:1234567899Sample Output:
Yes 2469135798
大整数加法
#include<stdio.h>
#include<string.h>
int num1[10],num2[10];
struct bign{
int d[1000];
int len;
};
void init(bign &a){
int i;
a.len=0;
for(i=0;i<1000;i++){
a.d[i]=0;
}
}
bign change(char *s){
bign a;
init(a);
int i,len=strlen(s);
a.len=len;
for(i=0;i<len;i++){
a.d[i]=s[len-1-i]-'0';
}
return a;
}
bign add(bign a,bign b){
bign c;
init(c);
int i,carry=0;
for(i=0;i<a.len;i++){
c.d[c.len++]=(a.d[i]+b.d[i]+carry)%10;
carry=(a.d[i]+b.d[i]+carry)/10;
}
if(carry){
c.d[c.len++]=carry;
}
return c;
}
void print(bign a){
int i;
for(i=a.len-1;i>=0;i--){
printf("%d",a.d[i]);
}
}
int main(){
char s[30];
scanf("%s",s);
int i,len=strlen(s);
for(i=0;i<len;i++){
num1[s[i]-'0']++;
}
bign a=change(s);
bign b=a;
bign c=add(a,b);
for(i=0;i<c.len;i++){
num2[c.d[i]]++;
}
int flag=1;
for(i=0;i<10;i++){
if(num1[i]!=num2[i]){
flag=0;break;
}
}
if(flag){
printf("Yes\n");
}
else{
printf("No\n");
}
print(c);
}