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
题意:
输入一串大整数a,令b=a*2,判断a中所有出现的数字及其个数是否与b中所有出现的数字及其个数相同,如果相同输出Yes及b,否则输出No及b.
思路:
(1)开数组num[],num[i] 记录 i(0<=i<=9)在大整数中出现的次数;
(2)将数字字符串转化成大整数时取结果的每一位数字 i 进行num[i]++操作,当大整数与低精度整数相乘时取结果的每一位数字 i 进行num[i]- -操作,如果最终得出num[0]~num[9]都等于0则输出Yes,否则输出No.
代码:
#include <cstdio>
#include <cstring>
int num[10] = {0};//记录0-9出现的个数
struct bign{//大整数
int d[25];
int len;
bign(){//构造函数,初始化结构体变量
memset(d,0,sizeof(d));
len = 0;
}
};
bign change(char str[]){//将数字字符串转化成大整数
bign a;
int len = strlen(str);
for(int i=0;i<len;i++){
a.d[a.len++] = str[len-1-i]-'0';//大整数数组的低位存放数字字符串的低位
num[a.d[i]]++;//出现的数字加1
}
return a;
}
bign multi(bign a,int b){//大整数与低精度整数乘法
bign c;
int carry = 0;
for(int i=0;i<a.len;i++){
int temp = a.d[i]*b+carry;
c.d[c.len++] = temp%10;
num[temp%10]--;//出现的数字减1
carry = temp/10;
}
while(carry!=0){
c.d[c.len++] = carry%10;
num[carry%10]--;//出现的数字减1
carry /= 10;
}
return c;
}
void print(bign a){//输出大整数
for(int i=a.len-1;i>=0;i--){
printf("%d",a.d[i]);
}
printf("\n");
}
int main(){
char str[25];
scanf("%s",str);
bign a = change(str);
bign b = multi(a,2);
for(int i=0;i<10;i++){
if(num[i]!=0){
printf("No\n");
print(b);
return 0;
}
}
printf("Yes\n");
print(b);
return 0;
}
词汇:
duplication 重复