需求:
很简单的一个需求,就是:把1变成A,2变B,超过了Z就从A0开始,AA,AB,AC……
原理:
这就是一个实现【Integer.toHexString(123)】方法的问题,上述中输入字符串为123456789ABCDEF就是toHexString,输入字符串是1234567就是toOctalString,
输入字符串是1就是toBinaryString。那么记录一下原理吧
十进制转k进制的原则是整数部分除k取余,小数部分乘k取整
那么用A-Z来表示数其实就是另类的27进制(26个字母+数字0),由于我们面对的只是整数,那么就讲A-Z存在一个字符串中,然后对数字进行除27取余,
在用余数去找数组中对应的字符,然后存到一个StringBuilder里面,最后返回结果的时候reverse一下就ok了。
边界条件考虑:
0:那么直接返回0
负数:先判断数字的符号,将符号存在一个sign变量里面,最后追加到StringBuilder中即可,然后把负数乘上-1当成正数来处理
编码:
package com.dyi.string; public class KBaseNumber { public static void main(String[] args) { for (int i = -100; i < 100; i++) { System.out.print("" + i + "__十进制: " + parseKBase(i, "123456789".split(""))); System.out.print(", " + "八进制: " + parseKBase(i, "1234567".split(""))); System.out.print(", " + "16进制: " + parseKBase(i, "123456789ABCDEF".split(""))); System.out.print(", " + "A-Z进制: " + parseKBase(i)); System.out.println(", " + "二进制: " + parseKBase(i, "1".split(""))); } } public static String parseKBase(int num) { String[] base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); return parseKBase(num, base); } public static String parseKBase(int num, String[] base) { if (num == 0) { return "0"; } int k = base.length; String sign = num >= 0 ? "" : "-"; num = num >= 0 ? num : -num; StringBuilder result = new StringBuilder(); while (num > 0) { int idx = num % k; num = num / k; if (idx == 0) { result.append("0"); } else { result.append(base[idx]); } } result.append(sign); return result.reverse().toString(); } }
结果:
朋友问的问题,顺手记录一下~