#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, но вы могли бы просто использовать вложенные циклы, чтобы получить все возможные перестановки, выполнить вычисление и распечатать перестановку, если результат вычисления соответствует числу, которое вы выбрали в качестве «результата» в перестановке