题目注意点
- 乘2以后的数字长度不一样时直接输出No
- 对大整数的乘法进行处理时,最后的进位可能不止1位,要用一个while循环把最后的进位的每一位分别存进高位中
实现
#include <stdio.h>
#include <string.h>
struct bign {
int d[25], num[10];
int len;
bign() {
memset(d, 0, sizeof(d));
memset(num, 0, sizeof(num));
len = 0;
}
};
bign change(char* str) {
bign a;
int len = strlen(str);
for (int i = 0; i < len; i++) {
a.d[len - i - 1] = str[i] - '0';
a.num[str[i] - '0']++;
}
a.len = len;
return a;
}
bign dbNum(bign a) {
bign c;
int carry = 0;
for (int i = 0; i < a.len; i++) {
int temp = a.d[i] * 2 + carry;
c.num[temp % 10]++;
c.d[c.len++] = temp % 10;
carry = temp / 10;
}
while (carry != 0) {
c.d[c.len++] = carry % 10;
carry /= 10;
}
return c;
}
int main() {
char str[25];
scanf("%s", str);
bign a = change(str);
bign c = dbNum(a);
if (a.len == c.len) {
int flag = 1;
for (int i = 0; i < 10; i++) {
if (a.num[i] != c.num[i]) {
flag = 0;
printf("No\n");
break;
}
}
if (flag == 1) printf("Yes\n");
} else {
printf("No\n");
}
for (int i = c.len - 1; i >= 0; i--) {
printf("%d", c.d[i]);
}
printf("\n");
return 0;
}