Математическое уравнение

Я создаю 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

Этот метод должен работать. Но такой цикл не должен занимать много сил даже при длинных числах.

Другие вопросы по тегам