На ум приходит ленивая оценка (например, Haskell и другие функциональные языки делают это за вас).Хотя вы пишете на императивном языке, вы можете применить концепцию, которую я думаю.
Рассмотрим операцию удаления оставшихся кардинальных чисел из набора кандидатов.Не касаясь реального алгоритма (и, что более важно, не угадывая сколько чисел вы создадите), выполните эту операцию ленивым образом (который вам придется реализовать, потому что вы 'на обязательном языке), когда и если вы попытаетесь взять наименьшее оставшееся число.