解题思路:
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 人评分
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:899 |
Pascal三角 (C语言代码)浏览:1184 |
求组合数 (C语言代码)浏览:1154 |
蛇行矩阵 (C语言代码)浏览:527 |
最小公倍数 (C语言代码)浏览:1028 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:520 |
C语言程序设计教程(第三版)课后习题10.7 (用指针求解)浏览:1473 |
矩阵的对角线之和 (C语言代码)浏览:1350 |
多输入输出练习2 (C语言代码)浏览:1655 |
C二级辅导-公约公倍 (C语言代码)浏览:1310 |