用小寫字母a-z代表0-25,進行兩個數的加法運算
這裏沒有用轉換成十進制的進制計算通用方式,那種網上已經有很多了,這裏用的是保留26進制,直接按最低位到最高位逐位相加的算法
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
//全局變量進位
private static int jinWei = 0;
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
System.out.println(hexPlus26(sc.next(), sc.next()));
}
}
private static String hexPlus26(String str1, String str2) {
ArrayList<StringBuffer> arr;
StringBuffer sbResult = new StringBuffer();
//將兩個字符串用'a'從最高位補全,併爲可能出現最長字符串最高位進一的情況,在最高位補一個a
if (str1.length() >= str2.length()) {
arr = completeStr(str1, str2);
} else {
arr = completeStr(str2, str1);
}
StringBuffer sb1 = arr.get(0);
StringBuffer sb2 = arr.get(1);
for (int i = sb1.length() - 1; i >= 0; i--) {
int plusResult = (int) sb1.charAt(i) - 97 + (int) sb2.charAt(i) - 97 + jinWei;
//如果發生進位,將全局變量jinWei改成1,並在下一次循環中加上,否則爲0
if (plusResult > 25) {
sbResult.append(Character.toString((char) (plusResult - 26 + 97)));
jinWei = 1;
} else {
sbResult.append((char) (plusResult + 97));
jinWei = 0;
}
}
//如果最後沒發生進位,去掉之前加的a
if (sbResult.charAt(sbResult.length() - 1) == 'a') {
sbResult.deleteCharAt(sbResult.length() - 1);
}
return sbResult.reverse().toString();
}
private static ArrayList<StringBuffer> completeStr(String str1, String str2) {
StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer();
ArrayList<StringBuffer> arr = new ArrayList<StringBuffer>();
int lengthDiff = str1.length() - str2.length();
//爲可能出現最長字符串最高位進一的情況,在最高位先補一個a(代表0)
sb1.append("a");
sb2.append("a");
//將兩個字符串長度用a補齊
for (int i = 0; i < lengthDiff; i++) {
sb2.append("a");
}
//將原字符串加到最後邊
sb1.append(str1);
sb2.append(str2);
arr.add(sb1);
arr.add(sb2);
return arr;
}
}