题解 | #[NOIP1999]回文数#
想死我了
#include<stdio.h> #include<stdbool.h> #include<math.h> #include<string.h> char c[100] = {0}; bool IsPalindrome(char* p, int len) { int left = 0; int right = len - 1; while ((left) < (right)) { if (p[left++] != p[right--]) return false; } return true; } int getInt(char n)//将'0'-'9'转换为0-9;'a'-'z'转换成10-35 { if (n >= '0' && n <= '9') return n - '0'; else { return n - 'A' + 10; } } char getChar(int n)//将0-9转换为'0'-'9';a-z转换成’a'-‘z' { if (n >= 0 && n <= 9) return n + '0'; else return n - 10 + 'A'; } void Add(char* a,int N,int len) { int sum1 = 0; int sum2 = 0; int tail = 0; int begin = 0; int end = len - 1; int i = 0; while (end >= 0) { sum1 = getInt(a[begin]); sum2 = getInt(a[end]); c[i] = getChar((sum1+sum2+tail)%N); tail = (sum1 + sum2 + tail) / N; end--; begin++; i++; } while (tail > 0) { c[i] = getChar(tail % N); tail /= N; i++; } } int main() { char a[100] = {0}; int N = 0; scanf("%d", &N); getchar(); scanf("%s", a); int len = strlen(a); if (IsPalindrome(a, len)) { printf("STEP=%d\n",1); return 1; } int count = 0; while (!IsPalindrome(a,len)) { Add(a,N,len); strcpy(a,c); len = strlen(c); count++; if (count >= 31) { printf("Impossible!\n"); return 0; } } printf("STEP=%d\n",count); return 0; }