思路:创建一个char数组接收数字,之后循环先判断是否为回文数,然后反序相加。我的add函数处理反序相加,创建另一个char数组存放反序的数字,之后就是两个数组相加进位的事了。(我的add函数可以反序相加处理1-16进制的数,16以上也可以)(很花心思,球球点个赞QAQ)
如有不对也请多加指正。
#include <stdio.h>
int pld(char M[], int* l) {//判断回文数
int left = 0;
int right = *l;
for (; left < right; left++, right--) {
if (M[left] != M[right])
return 1;
}
return 0;
}
void add(char M[], int* l, int n) {//对数字进行处理(反序相加,1-16进制皆可)
int i = 0;
int j = *l;
int sum = 0;
char M1[100];
for (i = 0; i <= *l; i++, j--)//创建新数组保存反序后的数
M1[i] = M[j];
for (i = 0; i <= *l; i++) {//处理十进制以上的数
if (M[i] > 57)
M[i] -= 7;
if (M1[i] > 57)
M1[i] -= 7;
}
for (i = 0; i <= *l; i++) {
sum = M[i] + M1[i] - 96;
M[i] = (sum % n + 48);//两个数相加取模n进制
if (i == *l) {//判断如果两个数的首尾相加有进位,l就加一(l记录这个数有几位数)
if ((sum / n) != 0) {
M[i + 1] = (sum / n + 48);
(*l)++;
}
break;
}
M[i + 1] = (sum / n + 48) + M[i + 1] - 48;//两个数相加的进位加到前一位去(没有进位就是加0)
}
for (i = 0; i <= *l; i++) {//处理十进制以上的数
if (M[i] > 57)
M[i] += 7;
}
}
int main() {
int n = 0;
int l = 0;
int step = 0;
char M[100];
scanf("%d", &n);
getchar();
int i = 0;
do {
M[i] = getchar();//将数字读入数组里
i++;
} while (M[i - 1] != '\n');
i -= 2;
l = i;//l是记录这个数有几位数
int left = 0;
int right = l;
do {//将数组里数字反序(这里是方便后面进位才反序的,实际的反序相加处理在后面的函数里)
int tmp = 0;
tmp = M[left];
M[left] = M[right];
M[right] = tmp;
} while (left++ < right--);
while (pld(M, &l)) {//如果不是回文数就继续反序相加处理
add(M, &l, n);
step++;
if (step > 30)//处理步数大于30就跳出循环
break;
}
if (step <= 30)
printf("STEP=%d", step);
else
printf("Impossible!");
return 0;
}

京公网安备 11010502036488号