解题思路:

String类数组构造方法与ASCII码的简单结合。。

代码块有点长,但思路很简单。。
注意事项:
已在代码块部分标明注释
参考代码:

import java.util.Scanner;

public class A1161{

 public static void main(String args[]) {
  Scanner sc = new Scanner(System.in);
  int N = sc.nextInt(); // 进制数
  String s0 = sc.next(); // 进制数数值

  int STEP = 0;

  for (int n = 1; n <= 31; n++) {
   if (n == 31) {
    System.out.println("Impossible!");
    break;
   }

//利用StringBuffer类直接翻转字符串
   StringBuffer s2 = new StringBuffer(s0);
   String s1 = s2.reverse().toString();


   if (s0.equals(s1) == true) {
    System.out.println("STEP=" + STEP);
    break;
   }

//模拟N进制加法运算,满N向高位进1
   int t = 0;// 向高位的进位,最低位进位为0.此语句位置不能放在循环里
   byte[] a = new byte[s0.length() + 1];    //数组长度加一,其中a【0】保存最高一位,参考下面**代码理解
   for (int i = s0.length() - 1; i >= 0; i--) {


    int w, e;   //选用Byte型数组,所以需要明白ascii码字符与对应的十进制数
    if (s0.charAt(i) >= 'A' && s0.charAt(i) <= 'F') {    //if与else语句为了求11即以上进制的两个加数

     w = s0.charAt(i) - 55;   //*******正向转换(与下述反向转换进行对照理解)
    } else {
     w = s0.charAt(i) - 48; 
    }
    if (s1.charAt(i) >= 'A' && s1.charAt(i) <= 'F') {
     e = s1.charAt(i) - 55;
    } else {
     e = s1.charAt(i) - 48;
    }


    int y = (w + e + t) % N;  

   if (y >= 10 && y <= 15) {
     a[i + 1] = (byte) (y + 55);   //******反向转换 
    } else {
     a[i + 1] = (byte) (y + 48);
    }


    if (w + e + t >= N) {    //求向高位的进位
     t = 1;
    } else {
     t = 0;
    }
   }

                                  //*********为最高位赋值
   if (t == 1) {            //最高为赋值,与上面不一样,只有0和1两种情况
    a[0] = 1 + 48;
    s0 = new String(a);
   } else {
    a[0] = 0 + 48;
    s0 = new String(a, 1, a.length - 1);
   }                           //***************最高为赋值结束 
   STEP++;
  }
 }


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论