7-49 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 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 <stdio.h>
#define MAX_BITS 21
int main(void) {
int bits = 0, i, num[MAX_BITS], doubled_num[MAX_BITS], carry = 0, double_bits;
int times[10] = { 0,0,0,0,0,0,0,0,0,0 }; //一个数中每个数字出现的次数(下标表示数字,下标对应的数据为该数字出现的次数)
int after_times[10] = { 0,0,0,0,0,0,0,0,0,0 }; //该数乘2后每个数字出现的次数
char temp;
temp = getchar();
while (temp >= '0'&&temp <= '9') { //输入原始数
num[bits] = temp - '0';
bits++;
temp = getchar();
}
double_bits = bits;
for (i = bits - 1; i >= 0; i--) { //模拟乘法
doubled_num[i] = num[i] * 2 % 10;
if (carry == 1) { //需要进位
doubled_num[i]++;
carry = 0;
}
if (num[i] * 2 >= 10) {
carry = 1;
}
if (i == 0 && num[i] * 2 >= 10) { //最高位需要进位
for (int j = bits; j >= 1; j--) { //所有数字往后挪一位(腾出最高位)
doubled_num[j] = doubled_num[j - 1];
}
doubled_num[0] = 1; //最高位为1
double_bits++; //乘2后的数位数加1
}
}
for (i = 0; i < bits; i++) { //统计原始数每个数字出现的次数
times[num[i]]++;
}
for (i = 0; i < double_bits; i++) { //统计乘2后每个数字出现的次数
after_times[doubled_num[i]]++;
}
for (i = 0; i < 10; i++) { //判断每个数字出现的次数是否一样
if (times[i] != after_times[i]) {
break;
}
}
if (i < 10 || bits != double_bits) { //每个数字出现次数不完全一样 或 乘2后位数与原始数不一样
printf("No\n");
int maxbits;
if (bits != double_bits) { //判断乘2后的位数
maxbits = double_bits;
}
else {
maxbits = bits;
}
for (i = 0; i < maxbits; i++) {
printf("%d", doubled_num[i]);
}
}
else {
printf("Yes\n");
for (i = 0; i < bits; i++) {
printf("%d", doubled_num[i]);
}
}
printf("\n");
return 0;
}