二十六进制加法(直接用26进制相加,非进制转换方式)
【二十六进制加法(直接用26进制相加,非进制转换方式)】用小写字母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 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 completeStr(String str1, String str2) {StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer();
ArrayList arr = new ArrayList();
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;
}
}
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 赢在人生六项精进二阶Day3复盘
- 2019年12月24日
- 陇上秋二|陇上秋二 罗敷媚
- 一百二十三夜,请嫁给我
- 迷失的世界(二十七)
- 我要我们在一起(二)
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- (二)ES6第一节变量(let|(二)ES6第一节变量(let,const)