For 循环中的 BigInteger 和 Java 中的列表

BigInteger in ForLoop and Lists in Java

我正在尝试创建并 return 一个 BigInteger 列表,该列表计算给定整数 n 作为斐波那契数列的降序总和。例如,如果给定整数 n = 8000,结果将是 return [6765, 987, 233, 13, 2].

我编写了一段代码,可以将斐波那契数列计算到一个列表中,而所述数字小于 n,但我不太清楚如何实现其余部分。

如果你打印 fibs 你会发现循环添加了两个 1,所以你应该删除 {fibs.add(BigInteger.ONE); fibs.add(BigInteger.ONE);} 行。

现在您已经有了所有的斐波那契数列,您可以从列表的末尾开始,并从 n 中减去数字,只要该值不为负即可。

向后迭代列表的最简单方法是反转列表并正常迭代它。

Collections.reverse(fibs);
for (BigInteger fib : fibs) {
    ...
}

您也可以在不反转列表的情况下执行此操作,方法是使用 ListIterator 向后迭代。

for (ListIterator<BigInteger> iter = fibs.listIterator(fibs.size()); iter.hasPrevious(); ) {
    BigInteger fib = iter.previous();
    ...
}

要找到可以从 n 中减去的数字,只需保留仍需要减少的 运行 值,即原始 b [=31] 的值=]仍然.

BigInteger remain = n;
for (BigInteger fib : fibs) {
    if (fib.compareTo(remain) <= 0) {  // if (fib <= remain)
        remain = remain.subtract(fib); //   remain -= fib;
    }
}

将减去的值添加到结果列表中,就完成了。

fib 函数对我来说太复杂了。只需根据最后两个元素的总和计算下一个元素:

public static List<BigInteger> fib(BigInteger n) {
    List<BigInteger> fibs = new ArrayList<>(asList(ONE, ONE));
    for (BigInteger last = ONE; last.compareTo(n) < 0; ) {
        last = last.add(fibs.get(fibs.size() - 2));
        fibs.add(last);
    }
    return fibs;
}

然后在列表中向后移动并保留适合总和的元素:

public static void main(String[] args) {
    BigInteger n = BigInteger.valueOf(8000);
    List<BigInteger> fib = fib(n);
    BigInteger remaining = n;
    for (int i = fib.size() - 1; i >= 0; i--) {
        if (fib.get(i).compareTo(remaining) > 0) {
            fib.remove(i);
        } else {
            remaining = remaining.subtract(fib.get(i));
        }
    }
    Collections.reverse(fib);
    System.out.println(fib);
}