沒找到原題的話術,這裏就憑藉印象來描述一下:
題目
用字母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生疏的同學來說,這道題可以作爲不錯的複習鞏固試題。