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

Rozkład liczby naturalnej

Object Storage Arubacloud
0 głosów
119 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 307 wizyt
pytanie zadane 14 marca 2018 w C i C++ przez Scypyon Gaduła (3,450 p.)
+5 głosów
2 odpowiedzi 1,330 wizyt
0 głosów
1 odpowiedź 152 wizyt

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

61,937 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...