说明
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加56(即把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,每组的第一行输入N,第二行输入M。
输出格式
对于每组输入数据,输出最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出"Impossible!"。
样例
输入数据 1
9
87
输出数据 1
STEP=6
【思路】
用一个整数数组存输入的数,一个循环进行模拟,循环进行31次,循环体内判断是不是回文数,如果是就输出当前步数,如果不是就求和,进入下一次循环,如果进行了整个循环就输出 “Impossible!”.
【代码】
#include<bits/stdc++.h>
using namespace std;
int a[1000] = {0};
int ans=0;
int tmp;
int n;
string m;
bool huiwen(int temp[] , int l , int r){
int i , j;
for(i = l , j = r ; i < j ; i++ , j--)
if(temp[i] != temp[j]) return false;
return true;
}
int sum(int a1[] , int len){
int temp[1000];
int i,j;
int jinwei=0;
int length=0;
for(i=0,j=len-1;i<len;i++,j--)
{
temp[i]=(a1[i]+a1[j]+jinwei)%n;
jinwei=(a1[i]+a1[j]+jinwei)/n;
}
length=i;
if(jinwei!=0)
{
temp[i]=jinwei;
length++;
}
for(int k=0;k<length;k++)
a[k]=temp[length-k-1];
return length;
}
int main()
{
cin>>n>>m;
for(ans=0;ans<m.size();ans++)
{
if(m[ans]>='A')
a[ans]=m[ans]-'A'+10;
else a[ans] = m[ans] - '0';
}
for(tmp=0;tmp<=30;tmp++)
{
if(huiwen(a,0,ans-1))
{
cout<<"STEP="<<tmp;
return 0;
}
else ans=sum(a,ans);
}
cout<<"Impossible!";
return 0;
}