Rozpisywanie liczby na wszystkie mozliwe kombinacje skladnikow / c
Ostatnio zmodyfikowano 2015-04-23 12:31
userx1 Temat założony przez niniejszego użytkownika |
Rozpisywanie liczby na wszystkie mozliwe kombinacje skladnikow / c » 2015-04-22 17:54:05 Czesc, mam problem z jednym programem, chodzi o rozpisanie podanej przez uzytkownika liczby na wszystkie mozliwe sposoby, kod ma byc w jezyku C, np: 3:
1+1+1 1+2 3
4:
1+1+1+1 1+1+2 2+2 3+1 4
i tak dla dowolnie wybranej liczby, nie wiem jak to napisac, ktos mi poradzil o liscie rekurencyjnej, ale nie wiem jak sie za to zabrac, znalazlem w internecie jeden przyklad kodu takiego programu ale jest dla mnie zbyt dlugi i skomplikowany i go nie rozumiem a chcialbym umiec napisac taki program, chcialbym od was moze jakis krotki prosty do zrozumienia przyklad albo jakas inna pomoc, bede wdzieczny, to ostatnie zagadanienie z kursu i chcialbym je zrozumiec, skoro wszystko poprzednie opanowalem w miare to nie chce miec jednego ostatniego zadania ktorego nie rozumiem. pozdrawiam |
|
darko202 |
» 2015-04-23 08:36:46 najprostszy algorytm jaki mi przychodzi do głowy to algorytm rekurencyjny dla liczba n, nasz algorytm rozkładu : rozkład(n)
wypisujemy
1, rozkład(n-1) 2, rozkład(n-2) .. n-1, rozkład(1) n, rozkład(0)
|
|
userx1 Temat założony przez niniejszego użytkownika |
» 2015-04-23 11:28:54 darko202 nic nie zrozumialem z tego co napisales. Btw, znalazlem w sieci kod i probuje go zrozumiec, nie rozumiem 1 linijki jakby ktos mogl wytlumaczyc bede wdzieczny, oto kod: #include <stdio.h> #include <stdlib.h> typedef struct { int first; int n; int level; } Call; void print(int n, int * a) { int i ; for (i = 0; i <= n; i++) { printf("%d", a[i]); } printf("\n"); } void integerPartition(int n, int * a){ int first; int i; int top = 0; int level = 0; Call * stack = (Call * ) malloc (sizeof(Call) * 1000); stack[0].first = -1; stack[0].n = n; stack[0].level = level; while (top >= 0){ first = stack[top].first; n = stack[top].n; level = stack[top].level; if (n >= 1) { if (first == - 1) { a[level] = n; print(level, a); first = (level == 0) ? 1 : a[level-1]; /* Problem mam tutaj, powiedzmy ze do rozpisania podalismy liczbe 10, i nie wiem ile w drugim odwiedzeniu tej linijki bedzie wynosilo a[level-1] ... bedzie to 10, 9, 1 czy moze 0 ? prosze o wartosc ktora w drugim okrazeniu zostanie przekazana do first. } else { i = first; i++; } if (i <= n / 2) { a[level] = i; stack[top].first = i; top++; stack[top].first = -1; stack[top].n = n - i; stack[top].level = level + 1; } else { top--; } } else { top --; } } } int main(){ int n; scanf("%i", &n); int * a = (int * ) malloc(sizeof(int) * n); printf("\nThe integer partition for %d is :\n", n); integerPartition (n, a); return(0);
|
|
userx1 Temat założony przez niniejszego użytkownika |
» 2015-04-23 12:31:44 okej ogarnalem problem, przy drugim okrazeniu wpisuje tam 1, sorki za zamieszanie :) zamykam |
|
« 1 » |