Найдите четыре последовательных числа, которые суммируются с заданным числом

Предположим, что существует определенное число, которое мы должны проверить, если оно является произведением четырех последовательных чисел?

Итак, если y - наше заданное число, мы должны проверить, если y = x(x+1)(x+2)(x+3) для любого произвольного x?

Как разработать алгоритм для этой проблемы?

Я сделал это вот так:

import java.util.*;

public class Product 
{
    public static int product(int i)
    {
         return i * (i+1) * (i+2) * (i+3);
    }

    public static void main(String[] args) 
    {
        Scanner scnr = new Scanner(System.in);
        int x = scnr.nextInt();
        for (int i = 0; i < x/2; i++)
        {
            if (product(i) == x)
            {
                System.out.println("number is product of 4 consecutive numbers");
                break;
            }
        }
    }
}

Ответ 1

Начиная с

y = x(x+1)(x+2)(x+3) = x^4 + 6x^3 + 11x^2 + 6x

Обратите внимание, что коэффициенты почти симметричны, но в конце нет 1.

Итак, предположим, что

y = z^2 - 1

то есть.

z^2 = x^4 + 6x^3 + 11x^2 + 6x + 1 

Существуют коэффициенты всех степеней x до 4, а коэффициенты x ^ 4 и x ^ 0 равны 1, поэтому нам нужно найти коэффициент при x ^ 1, который мы называем a:

z = (x^2 + ax + 1)^2 = x^4 + 2ax^3 + (2+a^2)x^2 + 2ax + 1

сравнивающий коэффициент при x ^ 1, x ^ 2 или x ^ 3, дает a = 3

(уравнения выше не требуют, чтобы любое из x, y или z было целым числом, но, возможно, потеряло бы сложные или отрицательные корни, нас это не интересует)

поэтому мы можем решить квадратичную для x:

x^2 + 3x + 1 - sqrt(y+1) = 0

дает

x = -3 +/- sqrt(9 - 4 * (1-sqrt(y+1))) 
    ---------------------------------
                2

  = -3 +/- sqrt(5 + 4 sqrt(y+1)) 
    ----------------------------
                2

который будет целым числом, если sqrt(y+1) является идеальным квадратом z, а (5+4z) также является идеальным квадратом (если z является целым числом, 5-4z является нечетным, поэтому его квадратный корень, если целое число также нечетно и x будет целым числом).

Итак, проверьте, является ли z = sqrt(y+1) целым числом, затем проверьте, является ли 5+4z идеальным квадратом.

Ответ 2

Вам нужно только проверить floor(y**(0.25)-1). Когда y стремится к бесконечности, x приближается к y**0.25-1.5 (снизу).

В некоторой степени это довольно интуитивно. x*(x+1)*(x+2)*(x+3) - произведение четырех чисел, среднее значение которых равно x+1.5. Когда x высока, 1.5 выглядит небольшим.

Ответ 3

Для большого количества чисел мы можем легко увидеть, могут ли они соответствовать определенному X или нет:

  • Y должно делиться на 3, так как по крайней мере одно из последовательных чисел должно быть делимым на 3
  • Y должно делиться на 4, так как по крайней мере одно из последовательных чисел должно быть делимым на 4

Итак, Y должен быть, по крайней мере, делимым на 12 (3 * 4). Это означает, что вы можете легко выбросить около 92% всех номеров.

Так как значение Y будет содержать по крайней мере 4-ю степень X, вы можете начать с того, что возьмете 4-й корень (или как вы это называете на английском языке) Y, затем округлите это число до целого числа значение, называя его X и вычисляя результат X (X + 1) (X + 2) (X + 3).

Результат, вероятно, будет выше (потому что мы пропустили другие факторы, такие как X, до степени 3, X до степени 2,...).

Теперь вычтите 1 из X и выполните те же вычисления.

До тех пор, пока результат будет больше, чем Y, повторите это, пока результат не станет ниже, или вы точно получите Y.

Ответ 4

Изменить: неправильно прочитайте вопрос, но для чего он стоит (быстрый способ проверить, не является ли он результатом четырех последовательных целых чисел):

Любое произведение из четырех последовательных целых чисел равно одному меньше, чем идеальный квадрат.

Ответ 5

Подсчитайте четвертый корень y, закруглите его и назовите его a. a(a-1)(a-2)(a-3) намного меньше y. Подсчитайте четвертый корень y, округлите его и назовите его b. b(b+1)(b+2)(b+3) намного больше, чем y. Теперь у вас есть три возможных числа, начиная с: a-2, a-1 и a (обратите внимание a = b или a = b-1). Поэтому достаточно проверить (a-2)(a-1)a(a+1), (a-1)a(a+1)(a+2) и a(a+1)(a+2)(a+3).

Ответ 6

Я бы начал с получения четвертого корня "y". Это даст вам приблизительное значение для наименьшего коэффициента y (т.е. X), который вы могли бы использовать. Используйте это как основу стандартного алгоритма факторизации.

Ответ 7

Ответ очень прост.
При заданном числе y, если y + 1 не является идеальным квадратом, тогда y не является продуктом четырех последовательных чисел. Если y + 1 - идеальный квадрат, то y является произведением четырех последовательных чисел тогда и только тогда, когда sqrt (5 + 4 * sqrt (y + 1)) является целым числом.

Ответ 8

Ваше уравнение можно упростить как

y = x^4 + 6*x^3 + 11*x^2 + 6x

Вы можете начать с x = 1 и идти вверх, чтобы проверить. Мы можем отметить очень легко вычислимую верхнюю границу: 4-й корень y (или квадратный корень квадратного корня y). Значит, когда вы достигнете этого числа, вы можете остановиться. Это вам повезло, потому что к счастью для нас, 4-й корни очень очень очень маленькие.

Для чисел до 10 000 это довольно легко проверить, потому что вы собираетесь проверять не более десяти целых чисел. Если ваш номер меньше 500, вам нужно всего лишь проверить четыре целых числа.

В 1,000,000+ вам нужно будет начать проверять 31 и более номеров, поэтому он может начать становиться менее тривиальным.


ВЕРХНИЕ И НИЖНИЕ БОЛОНЫ

После некоторого тщательного уточнения из-за Wolfram Alpha было сделано две вещи:

  • Более тонкая верхняя граница y ^ 0.25 - 1.2
  • Определенная нижняя граница у ^ 0,25 - 1,5

так...

y = num_to_check
k = Math.sqrt(Math.sqrt(y))   # or Math.pow(y,0.25)
lower = int(k-1.5)
upper = int(Math.ceil(k-1.2))
for n in (lower...upper)
  if n * (n+1) * (n+2) * (n+3) == y
    return n
  end
end
return nil

Обратите внимание, что в этом случае для любого заданного y существует максимум из двух чисел.

edit: после уточнения x только целых чисел, кажется, что во всех случаях есть только один номер, так как ваш диапазон уменьшается до одного числа. Круто! (спасибо Брайану)

Ответ 9

Как говорили другие, начните с 4-го корня y (позвоните ему z).

Из последовательности x, x + 1,... x + 3 мы знаем, что некоторые значения должны быть меньше z, а некоторые должны быть больше z (так как они не могут быть равны z).

Итак, мы знаем, что

x <= ceiling(z)
x+3 >= floor(z)

Это дает вам очень маленький диапазон чисел, чтобы попробовать x.