Вывести на экран все представления натурального числа n в виде суммы k натуральных слагаемых - C (СИ)
Формулировка задачи:
#include <stdio.h> #include <conio.h> #define Min( a, b ) ( ((a) < (b)) ? (a) : (b) ) #define MaxInt 32767; int N,a[1000]; void output(int count); void p(int k,int summ); int main(int argc, char* argv[]) { a[0]=MaxInt; scanf("%i",&N); p(1,0); getch(); return 0; } void output(int count) { int i; printf("%i",a[1]); for(i=2;i<=count;i++) printf("+%i",a[i]); printf("\n"); } void p(int k,int summ) { int i; if ((summ==N)&&(k>2)) output(k-1); if (summ<N){ for(i=1;i<=Min(N-summ,a[k-1]);i++){ a[k]=i; p(k+1,summ+i); } } }
виде суммы k натуральных
слагаемых.КАК ЕТО СДЕЛАТЬ?Решение задачи: «Вывести на экран все представления натурального числа n в виде суммы k натуральных слагаемых»
textual
Листинг программы
void F(int n, int k) { if (k < 1 || n < 1) ; else if (k==1) printf("+%d\n", n); else { for(i=1; i<n-k) i++) { printf("+%g", i); F(n-i, k-1); } } } main() { F(10,5); }
Объяснение кода листинга программы
- В функции
F
проверяется, еслиk
меньше 1 илиn
меньше 1, то ничего не происходит. - Если
k
равно 1, то выводится на экранn
с знаком+
. - В противном случае, в цикле
for
начинающемся сi=1
и выполняющемся доi<n-k
(поскольку при каждом вызове функцииF
значениеn
уменьшается наi
, а значениеk
уменьшается на 1) выводится на экранi
с знаком+
, после чего вызывается функцияF
с аргументамиn-i
иk-1
. - В функции
main
вызывается функцияF
с аргументами 10 и 5. - Значение
n
равно 10, а значениеk
равно 5. - При выполнении функции
F
в первом случае (когдаk
меньше 1 илиn
меньше 1) ничего не происходит. - Во втором случае (когда
k
равно 1) выводится на экран 10 с знаком+
. - В третьем случае (когда
k
больше 1) в цикле выводится на экран 1, 2, 3, 4, 5, 6, 7, 8, 9 с знаком+
, после чего вызывается функцияF
с аргументами 9 и 4. - При выполнении функции
F
в первом случае (когдаk
меньше 1 илиn
меньше 1) ничего не происходит. - Во втором случае (когда
k
равно 1) выводится на экран 9 с знаком+
. - В третьем случае (когда
k
больше 1) в цикле выводится на экран 4, 3, 2, 1 с знаком+
, после чего вызывается функцияF
с аргументами 6 и 3. - При выполнении функции
F
в первом случае (когдаk
меньше 1 илиn
меньше 1) ничего не происходит. - Во втором случае (когда
k
равно 1) выводится на экран 6 с знаком+
. - В третьем случае (когда
k
больше 1) в цикле выводится на экран 3, 2, 1 с знаком+
, после чего вызывается функцияF
с аргументами 4 и 2. - При выполнении функции
F
в первом случае (когдаk
меньше 1 илиn
меньше 1) ничего не происходит. - Во втором случае (когда
k
равно 1) выводится на экран 4 с знаком+
. - В третьем случае (когда
k
больше 1) в цикле выводится на экран 2, 1 с знаком+
, после чего вызывается функцияF
с аргументами 3 и 1. - При выполнении функции
F
в первом случае (когдаk
меньше 1 илиn
меньше 1) ничего не происходит. - Во втором случае (когда
k
равно 1) выводится на экран 3 с знаком+
. - В третьем случае (когда
k
больше 1) в цикле выводится на экран 1 с знаком+
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д