题解 | #[NOIP1999]回文数#
[NOIP1999]回文数
https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb
#include <stdio.h> int Check(char outzu[],int n)//返回一为真 { int i = 0; for (i = 0; i < n / 2;i++) { if (outzu[99 - i] != outzu[100 - n + i]) { return 0; } } return 1; }//从后开始判断 int main() { char arr[16] = { '0','1','2','3','4','5','6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char inzu[100] = { 0 }; char outzu[100] = { 0 }; int a = 0, b = 0; int n = 0; int i1 = 0, i2 = 0; int flag = 0; int flag2 = 0; scanf("%d %s", &a, inzu);//a是进制,b是数字 n = strlen(inzu); for (i1 = 0; i1 < n; i1++) { outzu[99 - i1] = inzu[i1]; } flag = Check(outzu,n); if (flag == 1) { printf("STEP=0"); } else { for (i1 = 0; i1 < n; i1++) { inzu[99 - i1] = outzu[99-i1]; }//初始化 int step = 0; while (step <= 30) { int c = 0; for (i1 = 0; i1 < n ; i1++) { if (inzu[99 - i1] >= 'A') { inzu[99 - i1] = inzu[99 - i1]-'A'+10+'0'; } if (inzu[100 - n + i1] >= 'A') { inzu[100 - n + i1] = inzu[100 - n + i1] - 'A' + 10 + '0'; } int tmp = (inzu[99 - i1] + inzu[100 - n + i1] - 2 * '0'+c) % a; outzu[99 - i1] = arr[tmp]; if (inzu[99 - i1] + inzu[100 - n + i1] - 2 * '0' +c>= a) { c = 1; } else { c = 0; } } if (c == 1 && i1 == n ) { outzu[99 - i1 ] = '1'; n++; } step++; flag = Check(outzu, n); if (flag == 1) { printf("STEP=%d", step); flag2 = 1; break; } else { for (i1 = 0; i1 < n; i1++) { inzu[99 - i1] = outzu[99 - i1]; }//初始化 } } } if (flag == 0) { printf("Impossible!"); } return 0; }