题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数5656,将5656加6565(即把5656从右向左读),得到121121是一个回文数。
又如:对于十进制数8787:
STEP1:8787+7878 = 165165
STEP2:165165+561561 = 726726
STEP3:726726+627627 = 13531353
STEP4:13531353+35313531 = 48844884
在这里的一步是指进行了一次NN进制的加法,上例最少用了44步得到回文数48844884。
写一个程序,给定一个NN(2 \le N \le 10,N=162≤N≤10,N=16)进制数MM(100100位之内),求最少经过几步可以得到回文数。如果在3030步以内(包含3030步)不可能得到回文数,则输出Impossible!
输入输出格式
输入格式:
两行,分别是NN,MM。
输出格式:
STEP=ans
输入输出样例
输入样例#1:
10
87
输出样例#1:
STEP=4
模拟过程
不用进行进制转换
将字符串转为数字(注意十六进制)存入数组,相加时注意进位。
字符串只需反转一次即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[1005],b[1005];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n,len;
string m;
cin>>n;
cin>>m;
len=m.size();
for(int i=0;i<len;i++){
if(m[i]=='A') a[i]=10;
else if(m[i]=='B') a[i]=11;
else if(m[i]=='C') a[i]=12;
else if(m[i]=='D') a[i]=13;
else if(m[i]=='F') a[i]=14;
else if(m[i]=='E') a[i]=15;
else a[i]=m[i]-'0';
}
int num=1;
while(num<=30){ //大于30时输出impossible
int j=0;
for(int i=len-1;i>=0;i--){ //反转字符串给B
b[j]=a[i];
j+=1;
}
for(int i=0;i<len;i++){ //字符串相加
a[i]+=b[i];
if(a[i]>=n){
a[i+1]+=1;
a[i]-=n;
}
}
if(a[len]>0) len+=1;
int flag;
for(int i=0;i<len;i++){ //判断回文
flag=0;
if(a[i]!=a[len-1-i]){
flag=1;
break;
}
}
if(flag==0) break;
num+=1;
}
if(num<=30) cout<<"STEP="<<num<<endl;
else cout<<"Impossible!"<<endl;
return 0;
}