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);
}
我正在尝试创建并 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);
}