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

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

Итак, если 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;
            }
        }
    }
}
13
задан Dukeling 20 April 2013 в 22:43
поделиться

9 ответов

Начиная с

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

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

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

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 полным квадратом.

39
ответ дан 1 December 2019 в 17:14
поделиться

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

4
ответ дан 1 December 2019 в 17:14
поделиться

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

3
ответ дан 1 December 2019 в 17:14
поделиться

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

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

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

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

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

0
ответ дан 1 December 2019 в 17:14
поделиться

Для многих чисел мы можем легко определить, подходят ли они под определенный 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.

.
6
ответ дан 1 December 2019 в 17:14
поделиться

Подсчитайте корень четвертой степени из 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 или а = b-1 ). Поэтому должно быть достаточно проверить (a-2) (a-1) a (a + 1) , (a-1) a (a + 1) (a + 2) и а (а + 1) (а + 2) (а + 3) .

5
ответ дан 1 December 2019 в 17:14
поделиться

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

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

5
ответ дан 1 December 2019 в 17:14
поделиться

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

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, были получены два вывода:

  1. Более уточненная верхняя граница y^0.25 - 1.2
  2. Определенная нижняя граница y^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 только до целых чисел, оказывается, что проверять нужно только одно число во всех случаях, так как ваш диапазон уменьшается до одного числа. Круто! (спасибо Брайану)

2
ответ дан 1 December 2019 в 17:14
поделиться

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

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

13
ответ дан 1 December 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: