Fighting


私信TA

用户名:Wgt

访问量:3810

签 名:

等  级
排  名 1737
经  验 2676
参赛次数 0
文章发表 4
年  龄 0
在职情况 学生
学  校 河南农业大学
专  业

  自我简介:

解题思路:

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 人评分

  评论区

  • «
  • »