《算法(第四版)》中的习题 1.3.5 中有这样一段代码:
Stack<Integer> s = new Stack<>(); while (N > 0) { s.push(N % 2); N = N / 2; } for (int d : s) System.out.print(d); System.out.println();
其作用是打印十进制整数 N 的二进制表示。下面解释该算法背后的道理。
为简化问题,默认输入的整数为正。
二进制整数转十进制整数的过程如下:
\[(k_nk_{n-1}\dotsm k_1k_0)_2=k_n2^n+k_{n-1}2^{n-1}+\dotsm+k_12^1+k_02^0 \]对于十进制整数 \((S)_{10}\),令:
\[(S)_{10}=k_n2^n+k_{n-1}2^{n-1}+\dotsm+k_12^1+k_02^0 \]要求 \((S)_{10}\) 的二进制表示,即求 \(k_0\sim k_n\)。而:
\[\frac{(S)_{10}}{2^1}=k_n2^{n-1}+k_{n-1}2^{n-2}+\dotsm+k_1\ \ 余\ k_0\\ \ \\ \frac{(S)_{10}}{2^2}=k_n2^{n-2}+k_{n-1}2^{n-3}+\dotsm+k_1\ \ 余\ k_1 \\.\\.\\.\\ \frac{(S)_{10}}{2^n}=k_n\ \ 余\ k_{n-1}\\ \ \\ \frac{(S)_{10}}{2^{n+1}}=0\ \ 余\ k_n \]按以上过程可写得程序。