解题思路:
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 人评分