У меня проблема. N
дано натуральное число. Мне нужно найти список натуральных чисел, которые суммируются до данного числа и в то же время обратные до 1.
a + b + c + ... = N
1/a + 1/b + 1/c + ... = 1
a
, b
, c
не обязательно должны быть уникальными.
В Java появился код. Он работает для простых случаев, но невероятно медленным уже для N > 1000
.
Как я могу переписать метод, чтобы он работал быстро даже для миллионов? Возможно, я должен отказаться от рекурсии или отключить некоторые ветки с математическим трюком, который я пропустил?
SSCEE:
private final static double ONE = 1.00000001;
public List<Integer> search (int number) {
int bound = (int)Math.sqrt(number) + 1;
List<Integer> list = new ArrayList<Integer>(bound);
if (number == 1) {
list.add(1);
return list;
}
for (int i = 2; i <= bound; i++) {
list.clear();
if (simulate(number, i, list, 0.0)) break;
}
return list;
}
//TODO: how to reuse already calculated results?
private boolean search (int number, int n, List<Integer> list, double sum) {
if (sum > ONE) {
return false;
}
//would be larger anyway
double minSum = sum + 1.0 / number;
if (minSum > ONE) {
return false;
}
if (n == 1) {
if (minSum < 0.99999999) {
return false;
}
list.add(number);
return true;
}
boolean success = false;
for (int i = 2; i < number; i++) {
if (number - i > 0) {
double tmpSum = sum + 1.0 / i;
if (tmpSum > ONE) continue;
list.add(i);
success = search(number - i, n - 1, list, tmpSum);
if (!success) {
list.remove(list.size() - 1);
}
if (success) break;
}
}
return success;
}