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

全部评论

相关推荐

vip牛牛:测试吧,开发现在至少212
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务