Manchester


私信TA

用户名:wenyajie

访问量:331897

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 65524
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
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;
}


别忘点赞哦-.-

 

0.0分

13 人评分

  评论区

void savein_A(int number,int *A,int *length)
{
 
   *length=0;
 
   while(number!=0)
   {
 
     A[(*length)++]=number%10;
     number/=10;
   }
 
   (*length)--;
}
后面为什么要减一啊 爸爸们
2020-09-23 20:15:52
超过10进制没有解决?
比如 输入 16 0xabc或16 abc
然后程序就炸了
2018-08-11 19:30:22
很好,拆分开来更方便理解子问题,也加强了模块化编程思想的理解
2018-01-02 14:35:02
  • «
  • 1
  • »