蓝桥杯 算法训练 回文数 (各种进制算法)

本文介绍了如何解决蓝桥杯中的回文数问题,涉及到回文算法和不同进制加法的实现。通过将问题分解为回文判断和进制加法两部分,详细阐述了思路并提供了代码实现。最终通过主函数完成整个计算过程。
摘要由CSDN通过智能技术生成

回文数

问题描述
  若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
  例如:给定一个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(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
  如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入格式
  两行,N与M
输出格式
  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)
样例输入
9
87
样例输出
STEP=6

详细思路和知识点:

这道题很明显是需要写一个算法来求得进制的加法1~10进制和16进制的加法,并且要能够转换回文序列,所以本题无非就两个点,一个是进制加法算法,一个是回文算法

第一步:回文算法:

public static String ver(String a) {
   
char [] m =a.toCharArray(); //把字符串变成字符组
 String s="";//储存字符串
 for(int i=m.length-1;i>=0;i--) {
   
  s+=String.valueOf(m[i]);//反序输出
 }
 return s;
}

上面的回文算法,既可以用来将字符串反转,也可以判断是否是回文序列,只要将字符串和回文字符串相比较即可,难点在于下面的进制加法,有点像大数的加法,只不过把十进制变成了各种进制

第二步:进制加法算法

步骤1:先将字符串变成字符数组,然后从后往前对应位数我往前加,超过进制需要进一位,就标记好flag=1,在下一次加法的时候,多加1即可。
步骤2:如果仅仅只是1-10进制,稍微简单一些,不需要考虑16进制的ABCDEF的转换,将16进制考虑进去,情况就稍稍有些复杂,而且从这道题来看,将字符串转换之后,可能首位会有0的情况,比如1680,转换之后就0861,这种情况没有16进制的情况,就可以直接把字符串0861转换成int形式,直接就可以去掉0变成861,相对来说会简单一些,如果加入16进制的话,那么有ABCDFEF在里面,就不太容易直接转换成int形去掉前面的0,所以有16进制就不能
考虑通过用int来去除0的方式,而是直接判断反转后字符串第一个是否是0,如果是,就把0换成"",对于其他进制来说也是一样的。讲起来思路有些复杂,代码详解更容易理解一点

具体代码如下:

public static String run(String a,String b,int c) {
   
//用一个字符串数组记录好1~F,如果没有16进制,可以忽略这一步和下一步,这两步都是因为有16进制做的准备
  String [] q = {
   "0","1","2","3","4","5","6","7","8","
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值