回文数(2-16进制数均可)Vijos 1304

描述

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

例如:给定一个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,其中16进制数字为0-9与A-F,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

格式

输入格式

共两行
第一行为进制数N(2<=N<=10或N=16)
第二行为N进制数M(0<=M<=maxlongint)

输出格式

共一行
第一行为“STEP=”加上经过的步数或“Impossible!”

样例1

样例输入1

9
87

样例输出1

STEP=6

提示:题目要求我们找回文数,对称的位置,数字相同,这个不难判断。(此处略过) 

问题:进制数一出,回文怎么写。

核心代码:

for(int i=1;i<=n;i++)
    {
        c[i]=a[i]+a[n-i+1]+c[i];
        c[i+1]+=c[i]/jz;
        c[i]%=jz;
    }

n:输入的字符长度,jz:进制,c:局部的数组,用来存放a数组例如87 78相加后的值,

  1. #include<bits/stdc++.h>

  2. using namespace std;

  3. string m;

  4. int jz,a[10001],s=1;

  5. int hw(int n)

  6. {

  7.     for(int i=1;i<=n;i++)

  8.     {

  9.         if(a[i]!=a[n-i+1])

  10.         return 0;

  11.     }

  12.     return 1;

  13. }

  14. int addition(int n)

  15. {

  16.     int c[1000]={0},s=1;

  17.     for(int i=1;i<=n;i++)

  18.     {

  19.         c[i]=a[i]+a[n-i+1]+c[i];

  20.         c[i+1]+=c[i]/jz;

  21.         c[i]%=jz;

  22.     }

  23.     if(c[n+1]!=0)

  24.         n++;

  25.     for(int i=n;i>=1;i--)

  26.     {

  27.         a[s]=c[i];

  28.         s++;

  29.     }

  30.     return n;

  31. }

  32. int main()

  33. {

  34.     cin>>jz>>m;

  35.     int n=m.size();

  36.     for(int i=1;i<=n;i++)

  37.     {

  38.         if(m[i-1]<65)

  39.         a[i]=m[i-1]-'0';

  40.         else

  41.         a[i]=m[i-1]-55;

  42.     }

  43.     while(s<=30)

  44.     {

  45.         if(hw(n)==1)

  46.         {

  47.             cout<<"STEP="<<s-1<<endl;

  48.             return 0;

  49.         }

  50.         s++;

  51.         n=addition(n);

  52.     }

  53.     cout<<"Impossible!"<<endl;

  54.     return 0;

  55. }  

猜你喜欢

转载自blog.csdn.net/xiaoa_axiao/article/details/81129666