对于任意数制R 的数n,都可以表达为 $$ n=\sum_{i=0}^{k} a_{i} R^{i}=a_{0} R^{0}+a_{1} R^{1}+a_{2} R^{2}+\ldots+a_{k} R^{k} $$
一、十进制转R进制 方法:十进制数除R RR取余,余数倒着写 例: 66(D)→1000 010(B)计算过程:
①66/2=33,余数为0 ②33/2=16,余数为1 ③16/2=8,余数为0 ④8/2=4,余数为0 ⑤4/2=2,余数为0 ⑥2/2=1,余数为0 ⑦1/2=0,余数为1
66(D)→42(H)计算过程: ①66/16=4,余数为2 ②4/16=0,余数为4
二、十六进制转二进制 方法:十六进制每一位写成四位的二进制数 例:42(H)→0100 0010(B)
三、八进制转二进制 方法:八进制每一位写成三位的二进制数 例:456(O)→100 101 110(B)
四、二进制转十进制 方法:二进制每一位加权求和 例:100 0010(B)→66(D) 计算过程: $$ 1 \times 2^{6}+0 \times 2^{5}+0 \times 2^{4}+0 \times 2^{3}+0 \times 2^{2}+1 \times 2^{1}+0 \times 2^{0}=66 $$
五、Java自带的进制处理 1 2 3 4 5 6 7 8 9 10 String s = Integer.toString(255, 16);//10进制数转0~35进制,结果为字符串 System.out.println("s="+s); System.out.println(Integer.toString(666, 36));//666(D)转换为36进制 int a = Integer.parseInt(s, 16);//把字符串当做多少进制,结果转换为10进制 System.out.println("a="+a); BigInteger m = new BigInteger(s,16);//把16进制的字符串封装为大数对象 System.out.println("big integer m="+m);
六、相关例题
题目一 题目介绍: 小赵对进制特别感兴趣,不必研究2进制, 3进制, 4进制, 5进制… ,突然有一次,他发现了一个特殊的数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。之后他就去翻书,发现这种数叫sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。
输入: 输入含有些小10000000 整数,如果为0,则输入结束。输出若为Sky数,则输出“#n is a Sky Number.”,否则输出“#n is not a Sky Number.”每个结果占一行。注意:#n表示所读入的n值。
样例输入
样例输出 1 2 3 4 5 1 is a Sky Number. 2992 is a Sky Number. 1234 is not a Sky Number. 0 is a Sky Number.
程序代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); if (getNum(n, 10) == getNum(n, 16) && getNum(n, 10) == getNum(n, 12)) { System.out.println(n + " is a Sky Number."); } else { System.out.println(n + " is not a Sky Number."); } } } public static int getNum(int n, int R) { int sum = 0; while (n > 0) { sum += n % R; n /= R; } return sum; } }
题目二 描述 求出一个集合中的所有子集
思路 一个元素的所有子集个数之和为2的n次方,可以用二进制的角度来分析
1 2 3 4 5 6 7 8 例如 {1,2,3,4} 0 0 0 1 表示只打印第一个 0 0 1 0 表示只打印第二个 1表示打印,2表示不打印 转化为类似于01背包的问题 不妨让0~15的二进制数来表示所有集合的结果
程序代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 public class Main { public static void main(String[] args) { char[] a = { 'A', 'B', 'C', 'D' }; for (int i = 0; i < Math.pow(2, a.length); i++) { System.out.print("{"); int n = i;// i表示第几种结果 int index = 0;//// 当前是第几次去除以2(二进制数位指针左移一位) while (n > 0) { // n%2的结果看的是二进制最左边那个数,例如0001 中的1 if (n % 2 == 1) { // 如果本位数显示是1则打印 if (n > 2) { System.out.print(a[index] + " "); } else { System.out.print(a[index]); } } // 指向二进制指针左移的次数,也是数组的指针或者索引(向右边移动) index++; n /= 2; // 把最后一位剔除掉,相当于 0 0 0 1变成了 0 0 0 } System.out.println("}"); } } }