问题描述
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。
例如:给定一个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.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”
写一个程序,给定一个N(2<N<=10或N=16)进制数M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”
输入样例
9 87
输出结果
6
#include<iostream>
#include<cstring>
using namespace std;
int panduan(int a[],int x)
{
for(int i=1;i<=x;i++)
{
if(a[i]!=a[x-i+1])
return -1;
}
return 1;
}
int main()
{
int n,count=0,a[100],i,b[100];
char s[100];
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
cin>>n>>s; //n是进制,s是待转化 数字
a[0]=strlen(s);
for(i=1;i<=a[0];i++)
{
if(a[i]>'A'&&a[i]<'G')
a[i]=s[i-1]-'A';
else if(a[i]>'a'&&a[i]<'g')
a[i]=s[i-1]-'a';
else
a[i]=s[i-1]-'0';
if(a[i]>=n)
{
a[i+1]=a[i]/n;
a[i]=a[i]%n+a[i];
}
}
while(panduan(a,a[0])<0)
{
//设置b数组,回文
memset(b,0,sizeof(b));
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++)
{
if(a[i]>=n)
{
a[i+1]=a[i]/n+a[i+1];
a[i]=a[i]%n;
}
}
count++;
if(count>30)
{
break;
}
if(a[a[0]+1]>0)
{
a[0]++;//修正a的位数,每回只能增加一个位数
}
}
if(count>30)
cout<<"no"<<endl;
else
cout<<count<<endl;
return 0;
}