题解 | #[NOIP1999]回文数#
[NOIP1999]回文数
https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb
#include <stdio.h> char a[100]={0}; int b[100]={0}; //为了防止读取字符串长度时遇到0,数字加1存储到a数组 void trans1(char* m,int len) { int i; for(i=0;i<len;i++) { if (m[i]>64) a[i]=m[i]-54; else a[i]=m[i]-47; } } int trans(int n) { int l,i,flag=1; l=strlen(a); //将a数组与倒置的a数组存入b数组 for(i=0;i<l;i++) { b[i+1]=a[i]+a[l-1-i]-2; } for(i=l;i>0;i--) { if(b[i]>n-1) { b[i]=b[i]%n; b[i-1]++; } } if(b[0]) { //判断b数组是否为回文数组 for(i=0;i<l/2+1;i++) { if(b[i]!=b[l-i]) { flag=0; break; } } //数组不是回文时将b数组存回a数组(仍需加一) for(i=0;i<l+1;i++) a[i]=b[i]+1; b[0]=0; } else { for(i=1;i<l/2+1;i++) { if(b[i]!=b[l+1-i]) { flag=0; break; } } for(i=0;i<l;i++) a[i]=b[i+1]+1; } return flag; } int main() { int N,len,count=0; char M[100]={0}; scanf("%d\n%s",&N,M); len=strlen(M); trans1(M,len); while(count<30) { count++; if(trans(N)) break; } //有一个自测step=30,预测输出却为impossible if(count>29) printf("Impossible!\n"); else printf("STEP=%d\n",count); return 0; }