原理:
2的1000次方用基本数据结构无法储存,所以想到用数组储存(链表也可以),我的思路:用足够大的数组(这里是1000),每个数组储存4个位数(也就是相当于10000进制大于9999时前面的数组加1)代码如下:
package 程序测试专用;
public class BinaryPlus {
<span style="white-space:pre"> </span>private final static int POW = 100000;
<span style="white-space:pre"> </span>private static int[] a = new int[POW ];
<span style="white-space:pre"> </span>public static void store(){
<span style="white-space:pre"> </span>a[a.length-1] = 1;
<span style="white-space:pre"> </span>for(int i=1;i<=POW ;i++){
<span style="white-space:pre"> </span>for(int j=a.length-1;j>=0;j--){
<span style="white-space:pre"> </span>a[j] *= 2;
<span style="white-space:pre"> </span>if(j+1<=a.length-1&&a[j+1]>9999){
<span style="white-space:pre"> </span>//System.out.println(a[a.length-1]);
<span style="white-space:pre"> </span>a[j] += 1;
<span style="white-space:pre"> </span>a[j+1] -= 10000;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//System.out.println(a[j]);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static int count(){
<span style="white-space:pre"> </span>int count = 0;
<span style="white-space:pre"> </span>for(int i=0;i<=a.length-1;i++){
<span style="white-space:pre"> </span>while(a[i]!=0){
<span style="white-space:pre"> </span>count += a[i]%10;
<span style="white-space:pre"> </span>a[i] /= 10;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return count;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void main(String[] args){
<span style="white-space:pre"> </span>store();<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/*for(int i=0;i<a.length;i++){
<span style="white-space:pre"> </span>if(a[i]!=0)
<span style="white-space:pre"> </span>System.out.println(a[i]);
<span style="white-space:pre"> </span>}*/
<span style="white-space:pre"> </span>System.out.println(count());
<span style="white-space:pre"> </span>}
}
但是当计算出的十进制大于4位时(列入计算2的15次方,结果为29位应为26位),我调试时发现进位发生在乘之前,导致高位进位后乘以2(其实应该是先乘之后再进位)
该算法的时间复杂度Tn = O(n^2) 空间复杂度Sn = Theta(n)