1309:【例1.6】回文数(Noip1999)

匿名 (未验证) 提交于 2019-12-02 23:43:01

传送门:http://ybt.ssoier.cn:8088/problem_show.php?pid=1309

【题目描述】

若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。

【输入】

给定一个N(2<N<=10或N=16)进制数M。

【输出】

最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。

【输入样例】

9 87

【输出样例】

6注意有16进制位因此要专门判断,再模拟即可
#include<iostream> #include<cstring> #define N 310 using namespace std; int a[N],lena; bool hw(){     for(int i=0;i<=lena/2;i++)         if(a[i]!=a[lena-i-1])return false;     return true; } int main(){     int n;     string m;     cin>>n>>m;     lena=m.size();     for(int i=0;i<lena;i++)     {         if(m[i]>='0'&&m[i]<='9')a[i]=m[lena-i-1]-'0';         else a[i]=(m[lena-i-1]-'A')+10;     }     if(hw()==true){cout<<0<<endl;return 0;}     for(int i=1;i<=30;i++){         for(int j=0;j<=lena/2;j++)a[j]+=a[lena-j-1];         for(int j=lena/2;j<lena;j++)a[j]=a[lena-j-1];         for(int j=0;j<lena;j++)         {             if(a[j]>=n){                 a[j+1]++;                 a[j]-=n;                 if(j==lena-1)lena++;             }         }         if(hw()){             cout<<i<<endl;             return 0;         }     }     cout<<"Impossible\n"; }

 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!