高精度-------得到回文数步数

问题描述  

若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。
例如:给定一个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;
}
发布了37 篇原创文章 · 获赞 3 · 访问量 1179

猜你喜欢

转载自blog.csdn.net/qq_45721778/article/details/104598616