回文数

来源:互联网 发布:海岛奇兵钢材升级数据 编辑:程序博客网 时间:2024/05/01 04:52

回文数

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 9   Accepted Submission(s) : 5

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, STEPl: 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”

Input

输入有多组数据,每组数据有两个数分别为进制数M和数N。

Output

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

Sample Input

10 87

Sample Output

4


#include <iostream>
#include <cstring>
using namespace std;
int a[110],b[110],ans,i,n;
bool ww(int a[])    //判别整数数组a是否为回文数
{
    for(i=1;i<=a[0];i++)
        if(a[i]!=a[a[0]-i+1]) return false;
        return true;
}
void ee(int a[])    //整数数组a与其反序数b进行n进制加法运算
{
    for(i=1;i<=a[0];i++)   b[i]=a[a[0]-i+1];  //存反序数
    for(i=1;i<=a[0];i++)   a[i]+=b[i];  //相加
    for(i=1;i<=a[0];i++)   //处理进位
    {
        a[i+1]+=a[i]/n;
        a[i]=a[i]%n;
    }
    if(a[a[0]+1]>0)  a[0]++;    //修改a的位数
}
int main ()
{ string s;
 while(cin>>n>>s)    
 {
        memset(a,0,sizeof(a));
        a[0]=s.length();
        for(i=1; i<=a[0]; i++)   //将字符转化为整数数组
        {
            if(s[a[0]-i]>='0'&&s[a[0]-i]<='9')  a[i]=s[a[0]-i]-'0'; 
            else
                a[i]=s[a[0]-i]-'A'+10;
        }


        if(ww(a))
        {
            cout<<0<<endl;
            continue;
        }
        ans=0;
        while(ans<=30)
        {   ans++;
            ee(a);
            if(ww(a))
            {
                cout<<ans<<endl;
              break;
            }
        }
        if(ans>30)cout<<"Impossible"<<endl;
 }


    return 0;
}

原创粉丝点击