解题思路:
1.输入进制:jinzhi,和数:number;

2.把number存放到数组A[]中,同时用length记录number最高位下标(这里0号元素代表number的个位数字)
3.把A[]中元素逆序存入B[]中;

下面开始递归:

4.把A[]每一位与B[]每一位相加存入A[],再把A[]进行进位操作,同时更新length;

5.把A[]中元素逆序存入B[]中;(用于判断A是否为回文数,若不是回文,则这一步为下一步STEP做准备,即代表上面第三步)

6.判断A是否为回文数(方法:A[],B[]下标从0到length的所有元素相同则是回文,若不是回文,继续从第四步开始执行)

7.结束条件为step大于30,或者回文数出现


每个实现函数

这个是递归函数初始时step设为1;
void function(int *A,int *B,int *length,int step,int *jinzhi)
{

   if(step>30)
   {
    printf("Impossible!\n");
    return ;
   }

   Aequa_AaddB(A,B,length,jinzhi);
   AintoB(A,B,length);
   if(judge_huiwen(A,B,length,step)==1)
   {
     return ;
   }

   function(A,B,length,step+1,jinzhi);

}
把number存入数组A中,同时求出number最高位下标
void savein_A(int number,int *A,int *length)
{

   *length=0;

   while(number!=0)
   {

     A[(*length)++]=number%10;
     number/=10;
   }

   (*length)--;
}
把A[]逆序存入B[];
注:A[0]是number的个位数;
void AintoB(int *A,int *B,int *length)
{
   for(int i=0,j=(*length);j>=0;j--,i++)    
      B[i]=A[j];
}
把A[],B[]每一位元素相加存入A[],同时进位A[],更新length;
void Aequa_AaddB(int *A,int *B,int *length,int *jinzhi)
{

    for(int i=0;i<=(*length);i++) //相加
      A[i]+=B[i];

    for(int j=0;j<=(*length);j++)  //进位
    {
       if(A[j]/(*jinzhi)&&j==(*length))  //更新length
       (*length)++;

       A[j+1]+=A[j]/(*jinzhi);
       A[j]%=(*jinzhi);
    }

}
判断A[]是否为回文数,是的话输出step,同时返回1;
不是回文数的话返回0;
(返回1,递归函数function结束,返回0,继续递归)
int judge_huiwen(int *A,int *B,int *length,int step)
{
   int i;

   for( i=0;i<=(*length);i++)
       {
          if(A[i]!=B[i])
          break;
       }

    if(i>(*length))
      {
        printf("STEP=%d\n",step);
        return 1;
      }
    else
        return 0;

}


注意事项:
测试数据为多组,同时输出带换行符;

多个函数构成一个程序,每次写完一个函数,在后面加上个结果输出,运行一下判断该函数运行结果是否满足期望,再写下一个;
参考代码:(主函数)

#include<stdio.h>
void function(int *A,int *B,int *length,int step,int *jinzhi);
void savein_A(int number,int *A,int *length);
void AintoB(int *A,int *B,int *length);
void Aequa_AaddB(int *A,int *B,int *length,int *jinzhi);
int judge_huiwen(int *A,int *B,int *length,int step);
/*===================================================================*/
int main()
{

 int jinzhi;
 int number;
 int length;

 while(scanf("%d%d",&jinzhi,&number)!=EOF)
 {
     int A[1000]={0};   //每次新的数开始都要初始化
     int B[1000]={0};
    savein_A(number,A,&length);
    AintoB(A,B,&length);

    function(A,B,&length,1,&jinzhi);
 }

return 0;
}
/*===================================================================*/
void function(int *A,int *B,int *length,int step,int *jinzhi)
{

   if(step>30)
   {
    printf("Impossible!\n");
    return ;
   }

   Aequa_AaddB(A,B,length,jinzhi);
   AintoB(A,B,length);
   if(judge_huiwen(A,B,length,step)==1)
   {
     return ;
   }

   function(A,B,length,step+1,jinzhi);
   return ;

}
/*===================================================================*/
void savein_A(int number,int *A,int *length)
{

   *length=0;

   while(number!=0)
   {

     A[(*length)++]=number%10;
     number/=10;
   }

   (*length)--;
}

/*===================================================================*/
void AintoB(int *A,int *B,int *length)
{

   for(int i=0,j=(*length);j>=0;j--,i++)
      B[i]=A[j];

}

/*===================================================================*/
void Aequa_AaddB(int *A,int *B,int *length,int *jinzhi)
{


    for(int i=0;i<=(*length);i++)
      A[i]+=B[i];


    for(int j=0;j<=(*length);j++)
    {
       if(A[j]/(*jinzhi)&&j==(*length))
       (*length)++;

       A[j+1]+=A[j]/(*jinzhi);
       A[j]%=(*jinzhi);
    }


}
/*===================================================================*/
int judge_huiwen(int *A,int *B,int *length,int step)
{
   int i;

   for( i=0;i<=(*length);i++)
       {
          if(A[i]!=B[i])
          break;
       }

    if(i>(*length))
      {
        printf("STEP=%d\n",step);
        return 1;
      }
    else
        return 0;
}


别忘点赞哦-.-

点赞(27)
 

0.0分

12 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 10 条评论

梦开始的地方 1年前 回复TA
@milk 高位进制可以用字符串列出来进一就序号加一,只不过更麻烦
职业摆烂人 3年前 回复TA
@milk @201812100214 可能你是将其他进制的数转化成十进制在做,这样测试数据中有一项会有出入2,10011
职业摆烂人 3年前 回复TA
@milk @201812100214 测试数据中有一项输入2,10011,它输出是step=4,我自己算和程序都是2,你估计也是这个地方有问题。
救世主在这里 4年前 回复TA
void savein_A(int number,int *A,int *length)
{
 
   *length=0;
 
   while(number!=0)
   {
 
     A[(*length)++]=number%10;
     number/=10;
   }
 
   (*length)--;
}
后面为什么要减一啊 爸爸们
华农赵子龙 5年前 回复TA
@milk 为啥我用字符数组的方式来做总是有50%的错误
Warren 5年前 回复TA
@milk 有待完善
milk 6年前 回复TA
超过10进制没有解决?
比如 输入 16 0xabc或16 abc
然后程序就炸了
Manchester 7年前 回复TA
@验题君 么么哒~
Manchester 7年前 回复TA
@验题君 
验题君 7年前 回复TA
很好,拆分开来更方便理解子问题,也加强了模块化编程思想的理解