题解 | #[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;
}

查看10道真题和解析