перепись с Питона на Си

Пожалуйста, помогите разогнать код или перевести код из Питона в Си:

numbers = [x, y, z, t]
for a in range(-1000, 1001):
    for b in range(-1000, 1001):
        for c in range(-1000, 1001):
            if a + b in numbers:
                numbers.remove(a+b)
                if a + c in numbers:
                    numbers.remove(a + c)
                    if b + c in numbers:
                        numbers.remove(b + c)
                        if a + b + c in numbers:
                            print(f'a = {a} | b = {b} | c = {c} ')
            numbers = [x, y, z, t] 

проблема в том, что рэндж будет больше для работы с большими числами, но питон это слишком долго обрабатывает, поэтому я подумал, что проще будет все переделать в Си, но я не знаю Си, поэтому прошу о помощи...


Ответы (1 шт):

Автор решения: KoVadim

если посмотреть на циклы, то тут перебирать много-много. очень много. Но давайте посмотрим внимательней. Очевидно, что a+b должно быть одним с 4 заданных чисел. Аналогично и с a+c. А это значит, что если зафиксировать a, то значения b и с входят в небольшой массив на 4 элемента. Всего то. А это сокращает время перебора в 250000 раз! Я не сильно переделывал код, совсем минимально.

numbers = [x, y, z, t]
for a in range(-1000, 1001):
    # это наш новый массив вариантов
    nr = [q - a for q in numbers]
    for b in nr: # и теперь бежим по маленькому списку
        for c in nr:  # аналоично
            if a + b in numbers: # вообще то это условие уже истинно, но мне лень
                numbers.remove(a+b)
                if a + c in numbers: # и это, но что если используем один вариант?
                    numbers.remove(a + c)
                    if b + c in numbers: # а это точно нужно проверить
                        numbers.remove(b + c)
                        if a + b + c in numbers: # надо было бы и это обыграть
                            print(f'a = {a} | b = {b} | c = {c} ')
            numbers = [x, y, z, t]

да, у этого кода есть одна маленькая проблема - в массиве nr могут быть числа, которые выходят за диапазон [-1000, 1000], но пусть это будет домашним заданием.

у меня этот код отрабатывает за доли секунды. Я увеличил диапазон до [-10000,10001] (в 100 раз!) и считало за 2 с половиной секунды на очень стареньком процессоре.

→ Ссылка