没找到原题的话术,这里就凭借印象来描述一下:
题目
用字母a-z表示26进制,编程26进制的加法(a代表0,b代表1,以此类推)
输入:(2行)
abcdefg
mvp
输出:(1行)
bcdrav
分析:
无非就是把2进制的算法移植到26进制中,再运用一个字母与数字的换算即可。
步骤:
- 计算26进制的字符串所代表的十进制数
- 两个十进制数相加求和
- 将十进制数的和再转化为26进制数
代码逻辑(java实现)
为了方便阅读,关键步骤都写在注释上了。
import java.util.Scanner;
import java.util.Stack;
public class q {
public static void main(String[] args) {
//获取26进制字符串
Scanner input = new Scanner(System.in);
String str1 = input.nextLine();
String str2 = input.nextLine();
//反转字符串,方便后面从个位取值
str1 = new StringBuilder(str1).reverse().toString();
str2 = new StringBuilder(str2).reverse().toString();
//拆分26进制字符串的每个字符,为char数组
char[] c1 = str1.toCharArray();
char[] c2 = str2.toCharArray();
//定义两个十进制数的累加器
long addNum1 = 0;
long addNum2 = 0;
//得出十进制数
for (int i = 0; i < c1.length; i++) {
//同2进制一样,(当前位数字*进制的i次方)的累加和
addNum1 += ((int) c1[i] - 97) * Math.pow(26, i);
}
//得出另一个十进制数
for (int i = 0; i < c2.length; i++) {
addNum2 += ((int) c2[i] - 97) * Math.pow(26, i);
}
//得出十进制总数
long sum = addNum1 + addNum2;
//考虑a+a=a的特殊情况
if (sum == 0) {
System.out.println('a');
return;
}
//用栈来保存每个26进制上每一位所代表的十进制数字
Stack<Long> stack = new Stack<Long>();
while (sum != 0) {
stack.push(sum % 26);
sum /= 26;
}
String str = "";
while (!stack.isEmpty()) {
//将int转char,并合并到字符串上
str += (char) (stack.pop() + 'a' - 0);
}
System.out.println(str);
}
}
小结
我觉得,其实这道题是很容易想到思路的,但是综合了很多常用的解题知识点:
- 字符串的反转
- 字符串的拆分
- 字母相关的ASCII
- char转int
- int转char
- 二进制转十进制思路
- 十进制转二进制思路
- 栈、出栈、入栈、栈的遍历
- 模运算
- Math.pow()次方运算
对于java生疏的同学来说,这道题可以作为不错的复习巩固试题。