Autor Wątek: Rozpisywanie liczby na wszystkie mozliwe kombinacje skladnikow  (Przeczytany 4035 razy)

Offline _user

  • Użytkownik

# Kwiecień 22, 2015, 20:28:16
spoko, ale prosze o odpowiedz na pytanie, jesli liczba podana do rozpisania bedzie 10 to przy drugim odwiedzeniu tej linijki "first = (level == 0) ? 1 : a[level-1]" ile doda ? 0,1,9,10 ? dokladniej opisalem to w poprzednim poscie moim w zakomentowanym kodzie.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline mawpa

  • Użytkownik

  • +1
# Kwiecień 23, 2015, 00:13:36
Geez. Trochę samodzielnego myślenia nie zaszkodzi... Wystarczy przeanalizować, co program robi.

Ewentualnie zrobić prymitywny debugging, czyli dodać printf.
first = (level == 0) ? 1 : a[level-1];
printf("first = %d\n", first);
Za każdym razem zobaczysz, ile masz w first.

Skąd się biorą te wartości, można wywnioskować symulując wykonanie programu. Jeśli masz z tym trudności, rozpisz sobie na kartce kilka obiegów tego while'a, linijka po linijce. Z początku chciałem to zrobić tutaj, ale nie będę Ci psuł zabawy ;)

Offline _user

  • Użytkownik

# Kwiecień 23, 2015, 02:06:51
nie wiem ile ma first ;c
Prosze wiec o powiedzenie mi :
first = (level == 0) ? 1 : a[level-1];

jesli podam 10 jako dana liczbe do rozpisania to ile ta linia da mi w drugim okrazeniu do first ?
Nie wiem ile to jest ten [level-1] to bedzie ten level0 z wartoscia 10 ? To chyba najlatwiejsze pytanie jakie zadalem w temacie, prosze juz tylko o odpowiedz na nie, i bede usadysfakcjonowany :)
« Ostatnia zmiana: Kwiecień 23, 2015, 02:34:06 wysłana przez _user »

Offline _user

  • Użytkownik

# Kwiecień 23, 2015, 12:25:54
Okej, ogarnalem co wpisuje do first, w drugim okrazeniu wpisuje tam 1 :) takze nie mam wiecej pytan.
« Ostatnia zmiana: Kwiecień 23, 2015, 13:29:57 wysłana przez _user »

Offline topik92

  • Użytkownik

# Kwiecień 23, 2015, 13:44:14
Możesz rozłożyć liczbę na tablice liczb z których da się ją z sumować dla 4 = {1 1 1 1 2 2 3 4}
for(int i=1; i<=szukanaLiczba;i++) // kolejne liczby od 1 do
    for(int j=0; j < szukanaLiczba / i ;i++)
//@up liczba wystapien kazdej liczby  dla 4 jeden raz dla 3 jeden raz, dla 2 dwa razy ect.
{
//zapisujesz elemnty w tablicy
}
Problem sprowadza się do z sumawania  i sprawdzenia każdej możliwej kombinacji.
Możesz spróbować zrobić to tak:
 tworzysz tablice o długości  takiej samej jak twoja pomocnicza wypłenioną  zerami  {0 0 0 0   0 0 0 0 } która bedzie reprezentować kolejne liczby  binarne od {0 0 0 0   0 0 0 0 } do { 1 1 1 1  1 1 1 1} Iteracyjnie zwiększasz ją ciągle o 1 i za  co iteracje sumujesz te wyrazy tablicy głównej którym opowiada 1 w pomocniczej.
Problem gdybys odpowiednio poifował to to mógł byś bardzo ograniczyć liczbe obliczeń.
Żeby nie zżerać tak duzo pamieci można zrobić taki myk że indeks tablicy + 1 oznacza wartość a liczba w nim w pisana ilośc elemntów, a w tablicy zamiast kolejnych liczb binarnych generować  liczby z zakresu 0-1 0-1 0-2 0-4.
« Ostatnia zmiana: Kwiecień 23, 2015, 14:37:59 wysłana przez topik92 »

Offline _user

  • Użytkownik

# Kwiecień 23, 2015, 13:51:13
@topik92 - to zbyt skomplikowane nic z tego nie rozumiem, ale nie wazne ziomus, juz ogarnalem tamta linijke w tym kodzie co znalazlem, rozumiem kod mniej wiecej wiec zadanie uwazam za wykonane :)

Offline topik92

  • Użytkownik

# Kwiecień 23, 2015, 14:34:16
W implementacji to są 2 pętle for by zrobić tablice z liczbami od 1-x, i jedna pętla for do sumowania i sprawdzania i funkcja zamieniająca liczby 10 na binarne która można zrobić na 1 pętli for.

@down dał bym Ci plusa ale się nie da :c
« Ostatnia zmiana: Kwiecień 23, 2015, 18:13:17 wysłana przez topik92 »

Offline Xender

  • Użytkownik

  • +1
# Kwiecień 23, 2015, 17:04:09
2 pentle
;_;

Włącz w przeglądarce sprawdzanie pisowni i nie grzesz więcej... :P

Offline voytech

  • Użytkownik

# Kwiecień 23, 2015, 17:58:00
nie wiem ile ma first ;c
Prosze wiec o powiedzenie mi :
first = (level == 0) ? 1 : a[level-1];

jesli podam 10 jako dana liczbe do rozpisania to ile ta linia da mi w drugim okrazeniu do first ?
Nie wiem ile to jest ten [level-1] to bedzie ten level0 z wartoscia 10 ? To chyba najlatwiejsze pytanie jakie zadalem w temacie, prosze juz tylko o odpowiedz na nie, i bede usadysfakcjonowany :)

może się mylę ale wydaje mi się że nie rozumiesz działania operatora "?:"

Kod: (c) [Zaznacz]
first = (level == 0) ? 1 : a[level-1];
to jest skrócona forma zapisu:

Kod: (c) [Zaznacz]
if (level==0) {
    first = 1;
} else {
    first = a[level-1];
}

Offline _user

  • Użytkownik

# Kwiecień 23, 2015, 18:09:08
... Dzialanie operatora rozumiem, nie wiedzialem co za wartosc jest w - a[level-1] , tylko tego, ale juz to przeanalizowalem i doszedlem do wniosku ze to bedzie w drugim okrazeniu 1, takze spoczko.

Offline voytech

  • Użytkownik

# Kwiecień 23, 2015, 18:40:50
pewnie w którymś okrążeniu level==0 wtedy odczyt z a[-1] staje się niebezpieczny i dlatego jest ten warunek