回文数(Noip 1999)

问题描述

若一个数(首位不为零)从左往右读与从右往左读都是一样,,我们就将其称之为回文数。例如:给定一个10进制数56,将56加65(即把56从右往左读),得到121是一个回文数。又如,对于十进制数87,step1:87+78=165step2:165+561=726step3:726+627=1353step4:1353+3531=4884在这里的一步是指进行了一次n进制的加法,上例最少用了4步得到回文数4884.写一个程序,给定一个n(2<n<=10或n=16)进制数m。求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“impossible”。

【输入样例】

9 87

【输出样例】

6

【算法分析】

n进制运算
1.当前位规范有10%改为n%
2.进位处理由/10改为/n
3.其他运算规则不变

【参考代码】

#include <iostream>
#include <cstring>
using namespace std;
int n,a[101],b[101],ans,i;
void init (int a[])
{//将数串s转化为整数数组a
 string s;
 cin>>n>>s;
 //读入字符串s
 memset(a,0,sizeof(a));
 //数组a清零
 a[0]=s.length();
 //用a[0]计算字符串s的位数
 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;
  }
 }
}
bool check(int a[])
{//判别整数数组a是否为回文数
 for(i=1;i<=a[0];i++)
 {
  if(a[i]!=a[a[0]-i+1])
  return false;
 }
 return true;
}
void jia(int a[])
{//整数数组a与其反序数b进行n进制加法运算
 int i,k;
 for(i=1;i<=a[0];i++)
 {//反序数b
  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]%=n;
 }
 if(a[a[0]+1]>0)
 {//修正新的a的位数(a+b最多只能进一位)
  a[0]++;
 }
}
int main ()
{
 init(a);
 if(check(a))
 {
  cout<<0<<endl;
  return 0;
 }
 ans=0;
 //步数初始化为0
 while(ans<=30)
 {
  ans++;
  jia(a);
  if(check(a))
  {
   cout<<ans<<endl;
   return 0;
  }
 }
 cout<<"impossible";
 return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43336281/article/details/86644052