Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите пожалуйста с задачей С++

Leyla Nuriyeva Ученик (193), открыт 4 недели назад
Дано натуральное число N. Требуется вывести все разбиения числа N на натуральные делители не меньшие M.
2 ответа
Илья Толмачёв Мастер (1068) 4 недели назад
 #include <iostream> 
#include <vector>

void findDivisors(int N, int M, std::vector<int>& current) {
// Если N == 1, значит мы нашли разбиение
if (N == 1) {
for (int i = 0; i < current.size(); i++) {
std::cout << current[i];
if (i < current.size() - 1) std::cout << " * ";
}
std::cout << std::endl;
return;
}

// Проходим по делителям, начиная с M
for (int i = M; i <= N; i++) {
if (N % i == 0) { // Проверка, что i является делителем N
current.push_back(i);
findDivisors(N / i, i, current); // Рекурсивно разбиваем N / i
current.pop_back();
}
}
}

int main() {
int N, M;
std::cout << "Введите число N: ";
std::cin >> N;
std::cout << "Введите минимальный делитель M: ";
std::cin >> M;

std::vector<int> current;
findDivisors(N, M, current);

return 0;
}
Leyla NuriyevaУченик (193) 4 недели назад
Спасибо
ауцыв уафсыв Гуру (4666) 4 недели назад
 #include <iostream> 
#include <vector>
void findPartitions(int n, int M, std::vector<int>& current) {
if (n == 0) {
for (size_t i = 0; i < current.size(); ++i) {
std::cout << current[i];
if (i != current.size() - 1)
std::cout << " + ";
}
std::cout << std::endl;
return;
}
for (int i = M; i <= n; ++i) {
current.push_back(i);
findPartitions(n - i, i, current);
current.pop_back();
}
}

int main() {
int N, M;
std::cout << "Введите N и M: ";
std::cin >> N >> M;

if (N <= 0 || M <= 0 || M > N) {
std::cout << "Некорректные значения N и M." << std::endl;
return 1;
}

std::cout << "Разбиения числа " << N << " на числа не меньшие " << M << ":" << std::endl;

std::vector<int> currentPartition;
findPartitions(N, M, currentPartition);

return 0;
}
Leyla NuriyevaУченик (193) 4 недели назад
спасибо
Похожие вопросы