问题描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个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进制数M(十进制以上用ABC代替),求最少经过几步可以得到回文数。
如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入格式
两行,N与M
输出格式
如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)
C++ Code:
#include<iostream>
#include<string>
using namespace std;
int N;
string M;
string fanxiang(string str)
{
int i;
char temp;
int le=str.length();
for(i=0;i<le/2;i++)
{
temp=str[i];
str[i]=str[le-i-1];
str[le-i-1]=temp;
}
return str;
}
int ishuiwen(string str)
{
int i;
int len=str.length();
char temp;
for(i=0;i<len/2;i++)
{
if (str[i]!=str[len-i-1])
return false;
}
return true;
}
int char2int(char A)
{
if (A>'9')
return A-'A'+10;
else
return A-'0';
}
char int2char(int n)
{
if (n>9)
return n+'A'-10;
else
return n+'0';
}
string addAB(string A,string B)
{
int lenA,lenB,i,j,temp=0,s;
string AB="";
lenA=A.length();
lenB=B.length();
i=lenA-1;
j=lenB-1;
while(1)
{
s=char2int(A[i])+char2int(B[j])+temp;
if (s<N)
{
temp=0;
AB=string(1,int2char(s))+AB;
}
else
{
temp=s/N;
AB=string(1,int2char(s%N))+AB;
}
if (i==0&&j==0)
break;
if (i==0)
A[i]='0';
else
i--;
if (j==0)
B[j]='0';
else
j--;
}
if (temp==0)
return AB;
else
return string(1,int2char(temp))+AB;
}
void diedai()
{
string temp=M;
int i,sp=0;
for (i=0;i<30;i++)
{
temp=addAB(M,fanxiang(M));
cout<<M<<"+"<<fanxiang(M)<<"="<<temp<<endl;
if (ishuiwen(temp))
{
sp=1;
break;
}
else
M=temp;
}
if (sp==1)
cout<<"STEP="<<i+1<<endl;
else
cout<<"Impossible!"<<endl;
}
int main()
{
while(1)
{
cin>>N;
cin>>M;
diedai();
}
return 0;
}
Results: