十进制内的任意进制之间的数字转换
来源:互联网 发布:美亚保险 淘宝 编辑:程序博客网 时间: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}}
阅读全文
0 0
- 十进制内的任意进制之间的数字转换
- 任意进制与十进制之间的转换
- 十进制与任意进制的转换
- 十进制和任意进制的转换
- 设计算法把一个十进制的整数转换成二至九进制之间的任意进制输出
- 任意进制(2-36内)与十进制间的转换
- 用栈实现十进制到任意进制的转换
- Python 十进制到任意进制的转换
- 将十进制转换为任意进制的数
- 任意进制之间的转换
- 进制转换:二进制、八进制、十六进制、十进制之间的转换
- 十进制转换任意进制
- 十进制转换任意进制
- 将任意的十进制整数转换成任意R进制数(R在2-16之间)
- 将任意一个十进制数数字转换为二进制形式,并输出转换后的结果
- 十进制与其他进制之间的转换
- 各种进制与十进制之间的转换
- 代码实现十进制与其他进制之间的转换
- Android 简单解读了ViewStub的代码和注释,其他的不想多说
- 高通410c下载安卓源码
- 洛谷P1902 刺杀大使(二分)
- 基于Matlab的FIR滤波器设计与实现
- Android 多线程 (一)
- 十进制内的任意进制之间的数字转换
- Android使用ContentProvider监听数据库
- python学习笔记5:PyCharm的配置
- Tomcat下载和修改端口
- 电感的前世今生
- Docker常用命令集合
- oracle 12c GI 执行root.sh脚本
- 解决onActivityResult()返回resultCode总是0的问题
- C语言入门——信号报告