0
import java.math.BigInteger;
import java.util.ArrayList;

public class Factorial {

    public static int[] bitVector(int n) {
        ArrayList<Integer> bitList = new ArrayList<Integer>();
        BigInteger input = computeFactorial(n);
        System.out.println(input);
        BigInteger[] result = input.divideAndRemainder(new BigInteger(String.valueOf(2)));
        if (result[0].intValue()==0) {return new int[]{result[1].intValue()};}
        else {
            bitList.add(result[1].intValue());
        }
        while(result[0].intValue() != 0) {
            result = result[0].divideAndRemainder(new BigInteger(String.valueOf(2)));
            bitList.add(result[1].intValue());
        }
        int[] array = new int[bitList.size()];
        for (int i=0; i<array.length; i++) {
            array[i]=bitList.get(i).intValue();
        }
        return array;
    }

    public static BigInteger computeFactorial(int n) {
        if (n==0) {
            return new BigInteger(String.valueOf(1));
        } else {
            return new BigInteger(String.valueOf(n)).multiply(computeFactorial(n-1));
        }
    }

    public static void main(String[] args) {
        int[] bitVector = bitVector(35);
        for (int bit: bitVector)
        System.out.print(bit+" ");
        System.out.println();
    }
}

当输入bitVector不大于时,上面的代码可以正常工作35。但是,当我36作为参数传递给bitVector时,输出中除了一位之外的所有内容都消失了。

我可能排除了以下原因:

  1. 它可能与 BigInteger 类型无关,因为它被设计为永不溢出。

  2. 它可能与仅380M在运行时使用的程序的内存使用情况无关。

  3. 我打印出 的值computeFactorial(36),看起来不错。

那里到底发生了什么?

4

2 回答 2

2

所以你想做的是

public static String factorialAsBinary(int n) {
    BigInteger bi = BigInteger.ONE;
    for (; n > 1; n--)
        bi = bi.multiply(BigInteger.valueOf(n));
    return bi.toString(2);
}

public static void main(String... args) {
    String fact36 = factorialAsBinary(36);
    for (char ch : fact36.toCharArray())
        System.out.print(ch + " ");
    System.out.println();
}

哪个打印

1 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

那里到底发生了什么?

你的代码比它需要的复杂得多,这也使得更容易出错和更难理解。

于 2013-02-04T09:18:56.913 回答
1

result[0].intValue()是错的:

整数值():

将此 BigInteger 转换为 int。这种转换类似于 Java 语言规范中定义的从 long 到 int 的缩小原语转换:如果这个 BigInteger 太大而无法放入 int,则只返回低 32 位。请注意,此转换可能会丢失有关 BigInteger 值的整体大小的信息,并返回带有相反符号的结果。

在您的情况下,它返回为零的最低 32 位,因此您在第一次划分后返回 0

于 2013-02-04T09:21:02.790 回答