二十六進制加法(直接用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<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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章