Вывести на экран все представления натурального числа 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 с знаком+.