回文不回文回文

题目:

【问题描述】
     若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, 
STEPl: 87+78= 165         STEP2: 165+561= 726 STEP3:726+627=1353  STEP4:1353+3531=4884   在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。   
        写一个程序,给定一个N(2<N<=10)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 
【输入样例】
       9 87
【输出样例】
       6

个人思路:

·1.首先,输入为一个整数N和一个N进制数,可将N进制数以字符串形式来输入,然后将其转化为一维数组进行处理

    输出为步数或Impossible,此处可以有判断得数是否为回文数的函数,并且注意步数的上限

·2.中间过程中,每“走一步”都要进行一次N进制的加法,因为不知道中间数或得数会有多大,并且为了N进制的加法,过程选择用高精度加法,可写成函数

    还有就是对回文数的判断,可从两边逐渐缩向中间

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char a[101];
 4 int a1[101],b1[101];
 5 int la,lb,N;
 6 void Turn(){                                  //将输入的字符串转换为数组
 7     for(int i=0;i<la;i++){
 8         a1[i]=a[i]-'0';
 9     }
10 }
11 bool check(){                                 //检测是否为回文数
12     for(int i=0;i<la;i++){
13         if(a1[i]!=a1[la-i-1]){
14             return false;
15         }
16     }
17     return true;
18 }
19 void Add(){                                   //高精度加法
20     for(int i=0;i<la;i++){
21         b1[i]=a1[la-i-1];
22     }
23     la+=2;
24     for(int i=0;i<la;i++){
25         a1[i]+=b1[i];
26         if(a1[i]>=N){
27             a1[i+1]++;
28             a1[i]-=N;
29         }
30     }
31     while(!a1[la-1]) la--;
32 }
33 int main()
34 {
35     int step=0;
36     scanf("%d%s",&N,a);
37     la=strlen(a);
38     Turn();
39     while(!check()){                          //此处不需要担心输入值即是回文数,如果输入为回文数则不会进入循环
40         step++;
41         if(step>30){
42             break;
43         }
44         Add();
45     }
46     if(step<=30){
47         printf("%d",step);
48     }
49     else{
50         printf("Impossible");
51     }
52     return 0;
53 }

 

posted @ 2021-11-23 22:10  LZMiiu  阅读(152)  评论(0编辑  收藏  举报