自测-4 Have Fun with Numbers (20point(s))
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
Example:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxDigits 32
#define BASE 10
char *Double(char src[], char dest[]);
const char *Check(char src[], char dest[]);
int main()
{
char src[MaxDigits];
char dest[MaxDigits];
char *res;
scanf("%s", src);
res = Double(src, dest);
printf("%s\n", Check(src, res));
printf("%s\n", res);
return 0;
}
const char *Check(char src[], char dest[])
{
char base1[BASE];
char base2[BASE];
memset(base1, 0, BASE);
memset(base2, 0, BASE);
while(*src) base1[*(src++)-'0']++;
while(*dest) base2[*(dest++)-'0']++;
for (int i = 0; i < BASE; i++)
if(base1[i] != base2[i]) return "No";
return "Yes";
}
char *Double(char src[], char d[])
{
size_t len = strlen(src);
memset(d, 0, MaxDigits);
d[0] = '0';
for(size_t i = 0; i < len; i++) {
int digit = (src[i] - '0') << 1;
d[i] += digit / BASE, d[i+1] += digit % BASE + '0';
}
if(d[0]=='0') return d+1;
else return d;
}
思路:
- 当字符串处理,double时若首位没有进位,则返回的结果从位1开始;
- 通过统计各个数字出现的次数,确认是否重新排列。