• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rozkład liczby naturalnej

Aruba Cloud - Virtual Private Server VPS
0 głosów
184 wizyt
pytanie zadane 18 maja 2019 w C i C++ przez Delfinek Nowicjusz (120 p.)

Witam. Mam do napisania program, który dla dowolnej liczby naturalnej wypisuje wszystkie możliwe rozkłady tej liczby na liczby naturalne, np. dla n=7 ma wypisać:

  • 7
  • 6,1
  • 5,2
  • 5,1,1
  • 4,3
  • 4,2,1
  • 4,1,1,1
  • 3,3,1
  • 3,2,2
  • 3,2,1,1
  • 3,1,1,1,1
  • 2,2,2,1
  • 2,2,1,1,1
  • 2,1,1,1,1,1
  • 1,1,1,1,1,1,1
    Kolejność liczb w kombinacji nie gra roli (nie trzeba wypisywać osobno 3,4 oraz 4,3). Dodatkowo mam za zadanie zliczyć, ile tych kombinacji jest. Nie mam żadnego pomysłu jak ten program zrobić. Próbowałam wykonać to tak, że najpierw wypisywałam pierwszą liczbę w kombinacji za pomocą pętli (od n do 1, zgodnie z powyższym przykładem) i do każdej tej liczby dobierałam kolejną, zakładając że nie będzie ona większa niż n/2 oraz będzie mniejsza lub równa w stosunku do pierwszej liczby. Jeśli te dwa składniki wciąż nie dawały razem wartości n, program dobierał dalej, sprawdzając czy suma jest już równa n. Pozwoliło to uzyskać częściowe rozwiązanie, jednak nie zwracało wszystkich możliwych kombinacji, gdyż nie uwzględniało przypadku, że np 2,2,2,1 można rozpisać dodatkowo jako 2,2,1,1,1, tylko od razu przechodziło do kombinacji 2,1,1,1,1,1.
    W związku z tym bardzo proszę o wskazówki jaką metodę mogłabym obrać. Moje pomysły się wyczerpały sad
komentarz 18 maja 2019 przez zanstaszek9 Obywatel (1,930 p.)

Trochę myślałem i taki algorytm prawdopodobnie byłby rekurencyjny oraz problemem byłoby to że odpowiedzi należałoby sprawdzać czy nie są zduplikowane (np 1+1+2 i 2+1+1 jest tym samym). Poczytałem na angielskim internecie i okazało się że te algorytmy wbrew pozorom są dość skomplikowane, głównie dlatego że ich złożoność bardzo, bardzo szybko rośnie - o ile liczbę 7 można rozłożyć w głowie, to np. 31 ma już zbyt dużo istniejących oraz duplikujących się kombinacji. Struktura set może się okazać pomocna bo nie przyjmuje duplikatów. Polecam poczytać, angielski termin to Partition

https://stackoverflow.com/questions/10035752/elegant-python-code-for-integer-partitioning
https://en.wikipedia.org/wiki/Partition_(number_theory)
https://stackoverflow.com/questions/2065553/get-all-numbers-that-add-up-to-a-number
https://stackoverflow.com/questions/28891477/recursive-function-counting-and-printing-partitions-of-1-to-n-1

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 551 wizyt
pytanie zadane 14 marca 2018 w C i C++ przez Scypyon Gaduła (3,450 p.)
+5 głosów
2 odpowiedzi 1,817 wizyt
0 głosów
1 odpowiedź 257 wizyt

93,332 zapytań

142,325 odpowiedzi

322,401 komentarzy

62,669 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...