自测-4 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.
输入格式:
Each input contains one test case. Each case contains one positive integer with no more than 20 digits.
输出格式:
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.
输入样例:
123456789
输出样例:
Yes
2469135798
思路:
- 大数存储。
- 进位处理。
- 数组对比。
代码:
#include <stdio.h>
#include <stdbool.h>
int main() {
int times(int a[], int len, int n);
bool flag = false;
char arr[21];
int num[20], b[20], i;//20位计算后变为21位的情况可以直接筛出,所以只申请20长度。
scanf_s("%s", &arr, 21);
for (i = 0; i < 21 && arr[i] != '\0'; i++) {
num[i] = arr[i]- '0';
}
/*加倍*/
int tag = 0;
for (int j = i-1; j >=0; j--) {
if (num[j] * 2 >= 10) {
if (j==0) {
b[j] = num[j] * 2+ tag;//对最高位为>=5的情况作处理
}
else {
b[j] = num[j] * 2 - 10 + tag;
}
tag = 1;
}
else {
b[j] = num[j] * 2 + tag;
tag = 0;
}
}
/*两个数组是否完全一致*/
for (int j = 0; j <= 9; j++) {
if (times(b, i, j)==times(num, i, j)) {
flag = true;
}
else {
flag = false;
break;
}
}
if (flag) {
printf("Yes\n");
}
else {
printf("No\n");
}
for (int j = 0; j < i; j++) {
printf("%d", b[j]);
}
return 0;
}
int times(int a[], int len, int n) {
int t = 0;
for (int k = 0; k < len; k++) {
if (a[k]== n) {
t++;
}
}
return t;
}
注意点:
- 数组比较相关内容。