Математическое уравнение
Я создаю Java- программу, но занимаюсь математической задачей, но не могу ее решить. Это мое назначение:
I have infinite numbers of numbered papers(1,2,3, ..).
This papers are stacked into stacks using 2 variables a and b.
If a = 5 and b = 3 the stacks look like:
So the first stack has "a" items (5) and each next has "b" more (3) as previous.
Теперь я должен выяснить уравнение, которое скажет мне, сколько документов мне нужно удалить, чтобы добраться до конкретного.
Например, если я хочу добраться до бумаги с номером 20, мне нужно будет удалить 4 бумаги, чтобы добраться до нее. И это то решение, которое я ищу, когда я ввожу номер определенной статьи, мне просто нужно знать, сколько мне нужно переместить (в той стопке, в которой она находится), чтобы добраться до нее. Когда у меня есть это, я кладу все бумаги обратно и ищу следующий.
Поскольку я сделаю для него программу, которая будет работать с длинными числами (до 16 цифр), лучшим решением было бы найти какое-нибудь уравнение "без петель". Например, если я установлю a = 34354 и b = 56774 и хочу узнать, сколько бумаг нужно удалить, чтобы попасть на бумагу с номером 533663634611112.
Мой вклад будет:
- числа а и б
- количество документов, которые я хочу достичь (с)
- относительно вышеупомянутой переменной (c) я введу это число, представляющее пронумерованные документы
Выход:
- количество бумаг, которые я должен переместить, чтобы добраться до всех бумаг, которые я вставил
Все числа будут очень длинными, поэтому лучше всего было бы сделать программу без цикла. Спасибо за помощь по этому вопросу.
3 ответа
Вам не нужно никаких петель для этого. Количество бумаг в n
это куча a + (n-1)b
, Так что количество статей в первом n
сваи есть (арифметическая серия) (b/2)n^2 + (a - b/2)n
,
Используя это, найдите количество стопок, необходимое для получения вашей бумаги. В вашем примере установите это значение равным 20 (и используйте 3 и 5). Так что у тебя есть 20 = 1.5n^2 + 3.5n
, Решение этого (используя квадратную формулу) дает n = -5
а также n = 8/3
, Не обращайте внимания на отрицательный, поскольку в этой ситуации это не имеет смысла.
Если вам нужно 8/3 стопки, чтобы добраться до вашей бумаги, она должна быть в третьей стопке (округлить до ближайшего целого (функция потолка)). Используйте формулу выше с n = 3
чтобы найти 24 бумаги в первых трех стопках (1.5 * 3^2 + 3.5 * 3 = 13.5 + 10.5 = 24
).
24 - 20 = 4 = количество бумаг, которые нужно удалить.
Ответ Мэти, но этого может быть достаточно, чтобы помочь вам:
Номер стека представляет собой одно целое решение двух неравенств:
ax + b(x-1)> argument AND a(x-1) + b(x-2) < argument
Можно ли это вычислить без использования цикла, я не могу сказать, и я не знаю ни одной библиотеки, которая могла бы вам помочь (хотя я не эксперт в математических библиотеках Java). После этого вы ищете ответ
a*x + b(x-1) - argument
Вам нужен какой-то цикл, чтобы сделать это. Я могу помочь с математикой, но кто-то может помочь с программированием
j=1
TOTAL = ja + (j-1)b
If the TOTAL is less than c, then let j=j+1 and loop
If the TOTAL is greater than c, end the loop (this loop shouldn't take too long)
Then calc TOTAL - c from it to get your answer
Этот метод должен работать. Но такой цикл не должен занимать много сил даже при длинных числах.