十进制内的任意进制之间的数字转换

来源:互联网 发布:美亚保险 淘宝 编辑:程序博客网 时间:2024/05/22 06:07

本程序能够把 "十进制内的任意进制的数 转为 另外一种进制的数" ,比如把8进制转为2进制。

这是我的原创,请尊重我的成果,转载请表明出处:http://blog.csdn.net/yanluandai1985/article/details/78305421

不支持16进制哦,如果需要16进制,请使用 Integer.parseInt("3c", 16);方法

这里是大宇的博客,我是学霸大宇,哈哈


package me.jea.sort;import java.util.ArrayList;public class DecimalTransform {/** * 将指定进制的数转为其它进制的数,比如把三进制的10 转为二进制是11 *  * @param number *         数字,它可能是任意一个进制的数 * @param oldJinZhi *         原来数的进制 * @param targetJinZhi *         目标进制 *  *         英语学的太烂了,进制去百度都找不到对应的英文,尴尬 这个方法的原理是 10进制的123 = 1*10^2 + 2*10^1 + *         3*5^0 5进制的123 = 1*5^2 + 2*5^1 + 3*5^0 那么首先需要拆分掉给定的数字,123拆为1,2,3 *         然后把1,2,3 乘以 指定的进制的 相应的次方 ,再相加即可转为十进制 *         然后利用本类的另外方法,把十进制转为其它进制,从而达到目的 *          *         注意:计算次方需要用到 double Math.pow()方法 ,并且需要使用int类型取整 */public static int transform(int number, int oldJinZhi, int targetJinZhi) {checkNumber(number, oldJinZhi);// 健壮性检查// 创建一个ArrayList,用来记录指定进制的数字 被拆分后的各个数字ArrayList<Integer> list = new ArrayList<>();split(list, number);// 把数字的每个部分拆分,装入这个list集合int result = calculate(list, oldJinZhi);// 把指定进制的数转为十进制return transform(result, targetJinZhi);// 把十进制转为任何进制}/** * 检查数字,如果一个数是二进制,那么它只能有0或者1,否则有异常 同理,如果一个数是n进制(1<n<10),那么它的数可以是[0,n-1] *  * @param number */private static void checkNumber(int number, int oldJinZhi) {check(number);// 要是正整数/** * 利用Integer的parseInt方法检查字符串, 将数字转为字符串,在把字符串转回来,这个过程中可以检查给定的数字的正确性 * 如果给的参数有字母,特殊符号,那么parseInt方法将抛出NumberFormatException *  */try {// 不允许有特殊符号Integer.parseInt(number + "");} catch (NumberFormatException e) {throw new RuntimeException("请输入合法的数字");}// 不允许数字超过指定的进制,3进制只能是0,1,2// 2进制只允许0,1// 先把数字转为字符串,便于检查每个部分String str_number = number + "";for (int i = 0; i < str_number.length(); i++) {int component = Integer.parseInt(str_number.charAt(i) + "");// 数字的某个部分if (component > oldJinZhi) {throw new RuntimeException("要被转换的数字超过指定的进制,比如二进制出现大于等于2的数字");}}}/** * @author jea * @param number *            被检查的数字 *  */private static void check(int number) {if (number < 0) {throw new RuntimeException("请输入合法的数字");}}/** * 把数字的每个部分拆分,装入到集合中 *  * @param list * @param number */private static void split(ArrayList<Integer> list, int number) {// 为了拆分,先把数字转为字符串String str_number = number + "";for (int i = 0; i < str_number.length(); i++) {int component = Integer.parseInt(str_number.charAt(i) + "");// 数字的某个部分list.add(component);}}/** * 根据list集合中存储的数字的各个部分的值, 将其转为十进制 *  * @param list * @return */private static int calculate(ArrayList<Integer> list, int oldJinZhi) {/** * 规律是   * 当数字的字符串是"456"  * 4的角标是0,次方是2,字符串数长度是3  * 5的角标是1,次方是1,字符串的长度是3 * 6的角标是2,次方是0,字符串的长度是3 */int sum = 0;for (int i = 0; i < list.size(); i++) {int component = list.get(i);// 数字的某个部分int ciFang = list.size() - 1 - i;sum = sum + (int) Math.pow(oldJinZhi, ciFang) * component;// 如果使用"3^5"将会计算错误,因为"^"是异或运算符}return sum;}/** * 转换,把十进制的数转为指定进制的数 例如,十进制的16,转为4进制后的结果是:100 *  * @param number * @param decimal * @return */public static int transform(int number, int decimal) {try {check(number);} catch (RuntimeException e) {return -1;}int result = reverse(number, decimal);return result;}/** * @author jea * @param number *            要被转换的十进制数字 * @param decimal *            要被转换的进制 * @return */private static int reverse(int number, int decimal) {int beiChuShu = number;// 被辗转相除的 被除数int yuShu = -1;// 余数// 创建一个ArrayList,用来记录辗转相除的取余的结果ArrayList<Integer> list = new ArrayList<Integer>();// 辗转相除,直到被除数为0while (beiChuShu != 0) {yuShu = beiChuShu % decimal;// 先要记录余数beiChuShu = beiChuShu / decimal;// 如果先执行这步,会把被除数修改掉,因此与上面的语句不应该颠倒list.add(yuShu);// 自动装箱}// 把辗转相除的结果反过来连接起来StringBuilder sb = new StringBuilder();for (int i = list.size() - 1; i >= 0; i--) {sb.append(list.get(i));}// 再将sb中的结果转为数字返回int result = Integer.parseInt(sb.toString());return result;}public static void main(String[] args) {int result = transform(16, 4);// 把十进制的16转为4进制100System.out.println(result);// 运行结果:100System.out.println(transform(10, 3, 2));//把三进制的10转为二进制,结果是11System.out.println(transform(10, 8, 2));//把八进制的10转为二进制,结果是1000}}



原创粉丝点击