Если вы напечатаете fibs
, вы поймете, что l oop добавляет две 1, поэтому вам следует удалить строку {fibs.add(BigInteger.ONE); fibs.add(BigInteger.ONE);}
.
Теперь, когда у вас есть все числа Фибоначчи, вы начинаете в конце списка и вычитать числа из n
, пока значение не будет go отрицательным.
Самый простой способ перебрать список в обратном порядке, это перевернуть список и перебрать его как обычно .
Collections.reverse(fibs);
for (BigInteger fib : fibs) {
...
}
Вы также можете сделать это, не переворачивая список, используя ListIterator
для итерации в обратном направлении.
for (ListIterator<BigInteger> iter = fibs.listIterator(fibs.size()); iter.hasPrevious(); ) {
BigInteger fib = iter.previous();
...
}
Чтобы найти числа, которые можно вычесть из n
просто оставьте текущее значение того, что еще нужно уменьшить, т. е. сколько из исходного b
остается .
BigInteger remain = n;
for (BigInteger fib : fibs) {
if (fib.compareTo(remain) <= 0) { // if (fib <= remain)
remain = remain.subtract(fib); // remain -= fib;
}
}
Добавьте значения, которые вычтите, в список результатов, и все готово.