Сумма простых чисел

У меня есть упражнение:

Напишите программу, которая берет на вход число n и выводит все случаи простых чисел, сумма которых равна n.

Например: ввод n = 13, вывод:

2 2 2 2 2 3
2 2 2 2 5
2 2 2 7
2 2 3 3 3
2 3 3 5
2 11
3 3 7
3 5 5
13

Вывод сортируется лексикографическим методом.

Я просто мог написать код для поиска простых чисел между 1-n:

n = int(input())
lst = []
for i in range(2, n + 1):
    isPrime = True
    for j in range(2, i - 1):
        if i % j == 0:
            isPrime = False
    if isPrime:
        lst.append(i)

print(lst)

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

Highway of Life 29.12.2022 20:52

на самом деле есть (строка 5), но вывод сортируется лексикографическим методом

Elio Baharan 29.12.2022 21:09

У вас есть все числа, так что вам просто нужно узнать, как суммировать список? или просто как сложить числа внутри цикла?

Sayse 29.12.2022 21:22

нет, мне нужно найти все случаи простых чисел, сумма которых равна n

Elio Baharan 29.12.2022 21:24

До сих пор не понятно, в чем ваш вопрос. Вы хотите, чтобы кто-то сделал вашу домашнюю работу за вас, то есть разработал для этого алгоритм? Какие подходы вы знаете, от каких уже отказались?

Ulrich Eckhardt 29.12.2022 21:24

Ваш вопрос по-прежнему сбивает с толку и звучит так, как будто вы хотите, чтобы кто-то написал всю программу за вас (делал за вас домашнюю работу?), если это не так, пожалуйста, отредактируйте сообщение, чтобы уточнить ваш вопрос. Включите все ошибки, с которыми вы столкнулись.

Highway of Life 29.12.2022 21:27

к сожалению, я не знаю какого-либо конкретного алгоритма для решения этой проблемы.

Elio Baharan 29.12.2022 21:27

Добро пожаловать в Stack Overflow. Пожалуйста, прочтите Как задавать вопросы и Как задавать домашние вопросы и отвечать на них?. Мы требуем, чтобы вопросы были конкретными и целенаправленными. Должно быть совершенно ясно, что «вычислить все возможные группы простых чисел, сумма которых равна N, и отобразить их» — это многоэтапный процесс. Вы несете ответственность за то, чтобы попытаться определить шаги и выяснить, где вы застряли.

Karl Knechtel 29.12.2022 21:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
8
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот мой взгляд на проблему.

solution = []
primes_up_to_n = [2, 3, 5, 7, 11, 13]

def get_sums(primes, n, path):
    global solution # keep track of solutions found so far.
    if n < min(primes):
        return # no more solutions are possible at this point
    for prime in primes:
        if n == prime:
            solution.append(path+[prime])
        get_sums(primes, n-prime, path+[prime])

get_sums(primes_up_to_n , 13, [])

k = [sorted(x) for x in solution] # order the solutions
print([*map(list, {*map(tuple, k)})]) # remove the duplicates

Объяснение:

  1. мы проверяем, находится ли текущий n в списке простых чисел. Если это так, это означает, что path + [n] является решением, поэтому мы добавляем его.
  2. мы рекурсивно вызываем get_sums, чтобы найти дальнейшие решения. Проблема с этим подходом заключается в том, что алгоритм, например, не различает [2, 2, 2, 2, 2, 3] и [2, 2, 2, 2, 3, 2]. Таким образом мы избавляемся от таких дубликатов в последних двух строках.

Код выводит:

[[2, 2, 2, 2, 2, 3],
[2, 2, 2, 7],
[2, 3, 3, 5],
[13],
[3, 3, 7],
[2, 2, 3, 3, 3],
[3, 5, 5],
[2, 2, 2, 2, 5],
[2, 11]]

Пожалуйста, прочтите Как ответить, а не просто пишите код по спецификации. Подобные вопросы не подходят для Stack Overflow, а код в ответах необходимо пояснять.

Karl Knechtel 29.12.2022 21:43

@Karl Knechtel Извините за это. Я думал, что человек попробовал, но в будущем я буду осторожнее. Для пояснений я отредактировал свой пост и надеюсь, что теперь он понятнее.

nonlinear 29.12.2022 22:00

Другие вопросы по теме