十进制转二进制的除二取余倒序法的逻辑依据是什么?
可以用十进制来类比:
一个数123456789用除十取余求它的十进制表达式
第一次除以10,商12345678 余9,
第二次除以10,商1234567 余8,
第三次除以10,商123456 余7,
…
一直到商比10小为止(n进制为商比n小为止)
咋取,是顺是倒,一目了然吧
下面具体说明
假设一个十进制数k要转换为n进制(设i位上的数字为m[i])
那么
k=m[i]*n^(i-1)+m[i-1]*n^(i-2)+m[i-2]*n^(i-3)+…+m[1]
当k第一次除以n的时候
商是m[i]*n^(i-2)+m[i-1]*n^(i-3)+m[i-2]*n^(i-4)+…+m[2] 余数是m[1]
同理 再次除以n的时候 余数是m[2]
…………………….
当最后,第i次除以n时 余数就是m[i]
倒序时候就是 m[i] m[i-1] 。。。m[2] m[1]
也就是转换出来的n进制数
事实上十进制数转换为任何n进制数的整数部分都能用除以n倒序取余
十进制转化成二进制代码如下:
//算法:除二倒序取余法
import java.util.LinkedList;
import java.util.Scanner;
public class shijinzhiToerjinzhi {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个整数:");
int n=scanner.nextInt();
scanner.close();
System.out.print(getBinary(n));
}
public static String getBinary(int num) {
int currentNum = num;//存放当前的被除数
LinkedList<String> list = new LinkedList<String>();//存放余数,也是就二进制数
while (currentNum != 0) {
if (currentNum % 2 == 0) {
list.addFirst("0"); //此处用 addFirst()可实现倒序取余
} else {
list.addFirst("1");
}
currentNum /= 2;
}
StringBuilder sb = new StringBuilder();//当然你可以使用其他形式作为方法的返回
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
}
return sb.toString();
}
}