Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Rozpisywanie liczby na wszystkie mozliwe kombinacje skladnikow / c

Ostatnio zmodyfikowano 2015-04-23 12:31
Autor Wiadomość
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
P-131277
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)



P-131306
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);
P-131313
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
P-131319
« 1 »
  Strona 1 z 1