Сгенерировать все комбинации сумм

#objective-c #c #algorithm #combinations

#цель-c #c #алгоритм #комбинации

Вопрос:

Учитывая набор из 6 чисел, например 1,5,8,9,2,6 и 2 операндов, например и — мне было интересно, как бы вы сгенерировали все возможные допустимые суммы, например 1 8 = 9 и так далее.

Числа могут быть положительным числом 0-9, а операнды могут быть возведены в квадрат — / * и иметь квадратный корень

Если кто-нибудь может помочь, я был бы очень признателен.

Спасибо

Комментарии:

1. Не могли бы вы пояснить, что означает «действительный»?

2. допустимый будет относиться к комбинации целых чисел, которые вычисляют, например, 1 2 = 3 было бы допустимым, 1 4 = 3 не было бы

Ответ №1:

поскольку это множество, а диапазон чисел равен [0,9] — тривиальным решением будет возврат, требующий не более 3 ^ n < 3 ^10 итераций. просто перебирайте все возможности (каждый элемент может быть в списке или отсутствовать в нем, и все возможности для «соединения» между двумя элементами. для унарных операций: с этим / без этого).
псевдокод:

 solution(set,aFormula,op1,op2):
  if set == []: print calculate(aFormula)
  else:
     solution(set[1-set.end],aForumula,op1,op2)
     solution(set[1-set.end],op1(aFormula,set[0]),op1,op2)
     solution(set[1-set.end],op2(aFormula,set[0]),op1,op2)
  

примечание — вам может потребоваться дополнительная обработка для унарных операций, но это не сильно изменит алгоритм.

Ответ №2:

«положительное число 0-9»

0 не является положительным числом.

«операнды могут быть возведены в квадрат — / * и иметь квадратный корень»

Квадрат и квадратный корень принимают только один параметр, так как же вы применяете это к двум элементам вашего списка?

Поскольку вы не указали здесь какой-либо язык, решение для добавления, как указано в вашем сообщении:

 a = [1, 5, 8, 9, 2, 6]
print set ( [x   y for x in a for y in a] )
  

Это позволяет суммировать один и тот же элемент с самим собой, если такое поведение не предусмотрено, измените его соответствующим образом.
Используйте другие операторы по мере необходимости.

Очень подробный пример на C:

 #include <stdio.h>

void main ()
{
    int list [6] = {1,5,8,9,2,6};
    int i, j;
    for (i = 0; i < 6; i  )
        for (j = i   1; j < 6; j  )
            printf ("%d   %d = %dn", list [i], list [j], list [i]   list [j] );
}
  

Комментарии:

1. Спасибо за ответ, извиняюсь, я хотел попросить примеры в objective-c

2. Хорошо, я добавил тег «objective-c» к вашему сообщению. Извините, не могу помочь вам с objective-c. Но идея та же. Возьмите вектор чисел, сопоставьте каждый элемент вектора с вектором (или вектором минус данный элемент) и примените желаемую операцию ко всем результирующим кортежам. Отклонить повторяющиеся результаты.

3. Спасибо, добавил тег C, так же хорошо, как я доволен и кодом на C. Просто собираюсь попробовать кое-что прямо сейчас

4. @Jonathan Я включил подробный пример C в свой ответ.

Ответ №3:

ну, поскольку существуют только 6*5*4 (выбирая числа из набора) * 4 (операнды), вы могли бы легко сгенерировать все возможные перестановки и проверить каждую на достоверность. Я не могу предоставить код на objective c, но вы могли бы просто использовать вложенные циклы, чтобы получить все возможные перестановки, выполнить вычисление и распечатать перестановку, если результат вычисления соответствует числу, которое вы выбрали в качестве «результата» в перестановке