noip 1999 回文数

题目描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

又如:对于10进制数87:

STEP1:87+78 = 165 STEP2:165+561 = 726

STEP3:726+627 = 1353 STEP4:1353+3531 = 4884

在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<=N<=10,N=16)进制数M(100位之内),求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

输入输出格式

输入格式:

两行,分别是N,M。

输出格式:

STEP=ans

输入输出样例

输入样例#1:
10
87
输出样例#1:
STEP=4

字符串
模拟
#include<cstdio>
#include<cstring>


char a[100],c[100];
int n;
int len;

void update()
{
    for(int i=0,j=len-1;i<len;i++,j--)
        c[j]=a[i];
    for(int i=0;i<len;i++)
        a[i]=c[i];
    for(int i=0;i<len;i++)
    {
        if(a[i]>=n)
        {
            if(i==len-1)len++;
            a[i+1]+=a[i]/n;
            a[i]%=n;
        }
    }
    for(int i=0,j=len-1;i<len;i++,j--)
        c[j]=a[i];
    for(int i=0;i<len;i++)
        a[i]=c[i];
}

bool pd()
{
    for(int i=0,j=len-1;i<=len/2;i++,j--)
    {
        if(a[i]!=a[j])return false;
    }
    return true;
}

int main()
{
    scanf("%d",&n);
    scanf("%s",a);
    
    len=strlen(a);
    for(int i=0;i<len;i++)
    {
        if(a[i]>='0'&&a[i]<='9')a[i]-=48;//0 = 48
        else if(a[i]>='A'&&a[i]<='F')a[i]=a[i]-'A'+10;
        else if(a[i]>='a'&&a[i]<='f')a[i]-=87;
    }
    
    int step;
    for(step=0;step<30;step++)
    {
        if(pd())break;
        for(int i=0;i<len;i++) 
            c[i]=a[i];
        for(int i=0,j=len-1;i<len;i++,j--) 
            a[i]+=c[j];
        update();
    }
    if(step!=30)
    printf("STEP=%d\n",step);
    else printf("Impossible!\n");
    return 0;
}

 

posted @ 2017-05-23 16:17  zzzzx  阅读(613)  评论(0编辑  收藏  举报