Представление заданного числа в виде всевозможных сумм - C (СИ)

Узнай цену своей работы

Формулировка задачи:

в программе подразумевается рекурсия,но в моем случае функция должна возвращать 2 значения,значит,надо писать структуры(которые мы еще не проходили) и с массивом работать нельзя. не могли бы вы мне подсказать алгоритм (возможно,моя реализация невозможна с помощью функции) вот мой код
Листинг программы
  1. #include <stdio.h>
  2. #include <cstdlib>
  3. #include <math.h>
  4. int main()
  5. {
  6. int n,t=0, k = 0,l=0;
  7. scanf_s("%d", &n);
  8. do
  9. {
  10. n = n - 1;
  11. k = k + 1;
  12. printf("%d",k);
  13. printf("+%d\n", n);
  14. } while (n > 0);
  15. if (k > 1)
  16. {
  17. do
  18. {
  19. k = k - 2;
  20. l = l + 1;
  21. if (k < 0) {
  22. break;
  23. }
  24. printf("1+%d", l);
  25. printf("+%d\n", k);
  26. } while (k > 0);
  27. }
  28. system("pause");
  29. }

Решение задачи: «Представление заданного числа в виде всевозможных сумм»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <locale.h>
  4.  
  5. #define MAX_INT_LENGTH 12
  6.  
  7. void printAllSums(const int);
  8. void decomposition(const int, const int, const char *);
  9. int min(const int, const int);
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.     setlocale(LC_ALL, "RU");
  14.  
  15.     int x;
  16.     printf("Введите число: ");
  17.     scanf("%d", &x);
  18.     printAllSums(x);
  19.  
  20.     return 0;
  21. }
  22.  
  23. void printAllSums(const int x){
  24.     decomposition(x, x, "");
  25. }
  26.  
  27. void decomposition(const int n, const int m, const char str[]){
  28.     if(!n){
  29.         printf("%s\n", str);
  30.         return;
  31.     }
  32.  
  33.     for(int i=min(n, m); i >= 1; i--){
  34.         char number[MAX_INT_LENGTH];
  35.         sprintf(number, "%d", i);
  36.  
  37.         char newStr[strlen(str) + strlen(number) + 2];
  38.         strcpy(newStr, str);
  39.         strcat(newStr, " ");
  40.         strcat(newStr, number);
  41.  
  42.         decomposition(n-i, i, newStr);
  43.     }
  44. }
  45.  
  46. int min(const int n, const int m){
  47.     return n < m ? n : m;
  48. }

Объяснение кода листинга программы

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

  1. В функции main устанавливается локальная настройка для вывода на русском языке.
  2. Пользователю предлагается ввести число.
  3. Число сохраняется в переменной x.
  4. Вызывается функция printAllSums с аргументом x.
  5. В функции printAllSums вызывается функция decomposition с аргументами x, x и пустой строкой ```` (в дальнейшем она будет дополняться числами).
  6. В функции decomposition используется рекурсивный подход для генерации всех возможных комбинаций чисел.
  7. Если число n равно 0, то текущая комбинация чисел печатается на экране.
  8. Если число n больше 0, то для каждого числа i от min(n, m) до 1 (включительно) создается новая строка number, которая содержит это число.
  9. Создается новая строка newStr, которая содержит исходную строку str, дополненную числом number, разделенными пробелом.
  10. Строка newStr передается в функцию decomposition с аргументами n-i, i и newStr.
  11. В функции min сравниваются числа n и m, и возвращается меньшее из них.
  12. Этот процесс повторяется для всех чисел i от min(n, m) до 1.
  13. Когда число n становится равным 0, текущая комбинация чисел печатается на экране.
  14. В функции main программа завершается после вывода всех комбинаций чисел.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы