перепись с Питона на Си
Пожалуйста, помогите разогнать код или перевести код из Питона в Си:
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 шт):
если посмотреть на циклы, то тут перебирать много-много. очень много. Но давайте посмотрим внимательней. Очевидно, что 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 с половиной секунды на очень стареньком процессоре.