【模拟】洛谷 P1015 回文数

来源:互联网 发布:网络监控工调试 编辑:程序博客网 时间:2024/05/21 07:34

题目描述

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

例如:给定一个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<iostream>#include<cstring>using namespace std;char a[110];int b[110],c[110],ans,step,n;bool judge(int k[],int len){    if(len%2==0)    {        int i=0,j=len-1;        while(i<j)        {            if(k[i]!=k[j])return false;            i++;j--;        }        return true;    }    if(len%2!=0)    {        int i=0,j=len-1,mid=(len-1)/2;        while(i<mid&&j>mid)        {            if(k[i]!=k[j])return false;            i++;j--;        }        return true;    }}void change(int len){    for(int i=0;i<len;i++)c[len-i-1]=b[i];}void add(int len){    int x=0;    for(int i=0;i<len;i++)    {//      cout<<b[i]<<' '<<c[i]<<' '<<x<<endl;        b[i]=b[i]+c[i]+x;//      cout<<b[i]<<' '<<x<<endl;        x=b[i]/n;        b[i]%=n;//      cout<<b[i]<<' '<<x<<endl;    }    b[len]=x;len++;    if(b[len-1]==0)len--;//  for(int i=0;i<len;i++)cout<<b[i];//  cout<<endl;    step++;    if(step>30)    {        cout<<"Impossible!";        return ;    }    if(judge(b,len))    {        cout<<"STEP="<<step;        return ;    }    else    {        change(len);        add(len);    }    return ;}int main(){    cin>>n;    scanf("%s",a);    for(int i=strlen(a)-1;i>=0;i--)    {        if(n==16)        {            if(a[i]>='0'&&a[i]<='9'){b[strlen(a)-i-1]=a[i]-48;c[i]=a[i]-48;}            if(a[i]>='A'&&a[i]<='Z'){b[strlen(a)-i-1]=a[i]-55;c[i]=a[i]-55;}        }        else {b[strlen(a)-i-1]=a[i]-48;c[i]=a[i]-48;}    }//  for(int i=0;i<strlen(a);i++)cout<<b[i];//  cout<<endl;//  for(int i=0;i<strlen(a);i++)cout<<c[i];    if(judge(c,strlen(a)))    {        cout<<"STEP=0";        return 0;    }    add(strlen(a));    return 0;}
0 0
原创粉丝点击