Представление заданного числа в виде всевозможных сумм - C (СИ)
Формулировка задачи:
в программе подразумевается рекурсия,но в моем случае функция должна возвращать 2 значения,значит,надо писать структуры(которые мы еще не проходили) и с массивом работать нельзя.
не могли бы вы мне подсказать алгоритм (возможно,моя реализация невозможна с помощью функции)
вот мой код
#include <stdio.h>
#include <cstdlib>
#include <math.h>
int main()
{
int n,t=0, k = 0,l=0;
scanf_s("%d", &n);
do
{
n = n - 1;
k = k + 1;
printf("%d",k);
printf("+%d\n", n);
} while (n > 0);
if (k > 1)
{
do
{
k = k - 2;
l = l + 1;
if (k < 0) {
break;
}
printf("1+%d", l);
printf("+%d\n", k);
} while (k > 0);
}
system("pause");
}Решение задачи: «Представление заданного числа в виде всевозможных сумм»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define MAX_INT_LENGTH 12
void printAllSums(const int);
void decomposition(const int, const int, const char *);
int min(const int, const int);
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "RU");
int x;
printf("Введите число: ");
scanf("%d", &x);
printAllSums(x);
return 0;
}
void printAllSums(const int x){
decomposition(x, x, "");
}
void decomposition(const int n, const int m, const char str[]){
if(!n){
printf("%s\n", str);
return;
}
for(int i=min(n, m); i >= 1; i--){
char number[MAX_INT_LENGTH];
sprintf(number, "%d", i);
char newStr[strlen(str) + strlen(number) + 2];
strcpy(newStr, str);
strcat(newStr, " ");
strcat(newStr, number);
decomposition(n-i, i, newStr);
}
}
int min(const int n, const int m){
return n < m ? n : m;
}
Объяснение кода листинга программы
В этом коде реализован алгоритм разложения числа на сумму двух меньших чисел. Он печатает все возможные комбинации чисел, которые в сумме дают заданное число. Вот список ключевых шагов:
- В функции
mainустанавливается локальная настройка для вывода на русском языке. - Пользователю предлагается ввести число.
- Число сохраняется в переменной
x. - Вызывается функция
printAllSumsс аргументомx. - В функции
printAllSumsвызывается функцияdecompositionс аргументамиx,xи пустой строкой ```` (в дальнейшем она будет дополняться числами). - В функции
decompositionиспользуется рекурсивный подход для генерации всех возможных комбинаций чисел. - Если число
nравно 0, то текущая комбинация чисел печатается на экране. - Если число
nбольше 0, то для каждого числаiотmin(n, m)до 1 (включительно) создается новая строкаnumber, которая содержит это число. - Создается новая строка
newStr, которая содержит исходную строкуstr, дополненную числомnumber, разделенными пробелом. - Строка
newStrпередается в функциюdecompositionс аргументамиn-i,iиnewStr. - В функции
minсравниваются числаnиm, и возвращается меньшее из них. - Этот процесс повторяется для всех чисел
iотmin(n, m)до 1. - Когда число
nстановится равным 0, текущая комбинация чисел печатается на экране. - В функции
mainпрограмма завершается после вывода всех комбинаций чисел.