Ile sie miesci

0

Czesc

Jak napisac funkcje ktora wygeneruje mi liste liczb mieszczacych sie w innej

tzn

bierzemy liczbe np 100 potem chce otrzymac cos takiego

100
99,1
98,2
98,1,1
97,3
97,2,1
97,1,1,1
96,4
96,3,1
96,2,2
96,2,1,1

itd az do

1,1,1,1,1,1,1,1,1,1,1 ....

Niedawno dopiero zaczelam programowac i niewiem jak to rozwiazac. Pogramuje w Borland C++ Builder Personal 6

Dzieki, czesc

0

Nie do końca rozumiem...
Mogłabyś rozwinąć swoją wypowiedź?

0

Chcialabym funkcje ktora po podaniu liczby wygenerowala by mi taki AnsiString

np podam 40
funkcja(40)

i ona zwrocilaby tablice AnsiStringow w postaci

40
39,1
38,1,1
38,2
37,3
37,2,1
37,1,1,1

itd

az do 1,1,1,1,1,1 (40 jedynek)

0

Chodzi ci o tablicę dwuwymiarową? A co do zwykłego generowania to taki kod:

    int liczba;
    int delta = 1; //tym regulujesz odejmowanie
    int ile_bylo = 0;
    cin >> liczba;
    for (int i = liczba; i > 0; i -= delta)
    {
        cout << i << " ";
        for (int j = 0; j < ile_bylo; j++)
        {
            cout << delta << " ";
        }
        cout << endl;
        ile_bylo++;
    }
0

Niewiem.. musze miec to jako AnsiStringi kazda linijka jako AnsiString a wiec jedno wymiarowa?

0

Czyli chcesz każdą linijkę 96, 1, 1, 1, 1 - jako jeden string i reszta stringów daje tablicę. O to Ci chodzi? Podstawę algorytmu już Ci napisałem, ale reszta kombinacji to już nie wiem, niech starsi koledzy pomogą.

0

No!! Tak cos takiego ale kazda mozliwosc..

Aha szkoda może ktoś inny mi pomoże?

0

Na moje oko tych kombinacji wyjdzie wykładnicza ilość. Dla małych liczb może i jest sens generować tablicę, ale dla większych zabraknie pamięci prawie natychmiast.

0

potrzebna mi funkcja dla takich liczb dla ktorych nie zabraknie pamieci

1

Gotowiec w prologu:

combinations(0, []).
combinations(X, [ComH|ComT]) :-
	between(1, X, ComH),
	X1 is X - ComH,
	combinations(X1, ComT).

Nie napisałaś więc założyłem że wszystkie permutacje, czyli dla 3 zarówno [2, 1] i [1, 2].

0

Nikt nie wie jak to zrobić? :(

0

Prosto - użyj rekurencji ;) Pogłówkuj trochę i będzie po sprawie.

4

w C można tak:

O1OO[0100];main( OlOO, O1O0,Ol0O, O100){if(OlOO){
	  scanf( "%d",&O1O0);
main(0000,       O1O0 +O1O0,O1O0, 0000);} else { O1OO[O100]=Ol0O;if ( O1O0
 ==  Ol0O ) {for(OlOO=!0000;OlOO<=O100;OlOO++)printf("%d ", O1OO     [OlOO
]);puts("");}for(OlOO= Ol0O<O1O0 -Ol0O?Ol0O:O1O0-Ol0O;OlOO >= !! 0100;OlOO
--)main ( 0000 , O1O0- Ol0O,OlOO, O100+!!   OlOO);}}

http://ideone.com/AWhLO

0

Dla mnie to troche czarna magia

0

Rozwiązanie niezbyt eleganckie, ale bez zbędnych powtórzeń (MSM) i troche bardziej czytelne niż xitami.

n=input("Podaj n: ")

result=[]
for i in range(1,n+1):
   result.append([i,i])

result.reverse()
done=False
while not done:
   old=result
   result=[]
   done=True
   for l in old:
      if l[0]<n:
         done=False
         for j in range(1,min(n-l[0],l[-1])+1):
            nowy=[]
            for k in l:
               nowy.append(k)
            nowy.append(j)
            nowy[0]+=j
            nowy.sort()
            nowy.reverse()
            result.append(nowy)
      else:
         result.append(l)
for l in result:
   print(l[1:])
print(len(result))
0

potrzeba tylko chwili by "moje" zapisać inaczej:

void part(int n, int k, int t){
	int a;
	p[t]=k;
	if(n==k)
		printit(1, t);
	for(a=min(k, n-k); a>=1; a--)
		part(n-k, a, t+1);
}
	...
	part(2*n, n, 0);
0

A co to jest p[t] = k; ?
to tablica? Nie jest nigdzie zdefiniowana.

0

tak, tablica z miejscem na N+1 liczb

1 użytkowników online, w tym zalogowanych: 0, gości: 1