解题思路:
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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复