0352 - Sum Cons
Cerinţa
Se citește numărul natural nenul n. Determinați toate modalitățile de a-l scrie pe n ca sumă de cel puțin două numere naturale consecutive nenule.
Date de intrare
Programul citește de la tastatură numărul n.
Date de ieşire
Programul afișează pe ecran descompunerile cerute, câte o descompunere pe o linie a ecranului, în ordine crescătoare a numărului de termeni din descompunere, termenii unei descompuneri fiind scriși în ordine crescătoare și separați prin exact un spațiu.
Restricţii şi precizări
1 ≤ n ≤ 10.000.000 pentru fiecare test, numărul n se poate scrie ca sumă de cel puțin 2 numere naturale consecutive nenule în cel puțin un mod.
Exemplu:
Date de intrare 30
Date de ieșire 9 10 11 6 7 8 9 4 5 6 7 8
Rezolvare
<syntaxhighlight lang="python" line> def validate_input(n):
""" Verifică dacă numărul dat este un număr natural nenul și se află în intervalul specificat. """ if not isinstance(n, int) or n <= 0 or n > 10000000: raise ValueError("Numărul trebuie să fie un număr natural nenul între 1 și 10.000.000.")
def read_input():
""" Citește numărul n de la tastatură și verifică dacă datele sunt corecte. """ n = int(input("Introduceți numărul n: ")) validate_input(n) return n
def output_result(result):
""" Afișează toate seriile de numere consecutive găsite. """ for series in result: print(" ".join(map(str, series)))
def main():
n = read_input()
result = [] for start in range(1, n // 2 + 1): series = [start] while sum(series) < n: series.append(start + len(series)) if sum(series) == n: result.append(series) else: while sum(series) > n: series.pop(0) if sum(series) == n: result.append(series)
output_result(result)
if __name__ == "__main__":
main()
</syntaxhighlight>
Explicatie
Acest cod Python implementează o soluție pentru a determina toate modalitățile de a scrie un număr natural nenul dat ca o sumă de cel puțin două numere naturale consecutive nenule.
Funcția validate_input verifică dacă numărul dat este un număr natural nenul și se află în intervalul specificat. Dacă nu este cazul, aceasta generează o excepție de tip ValueError.
Funcția read_input citește numărul n de la tastatură și verifică dacă datele sunt corecte apelând funcția validate_input. Funcția returnează n.
Funcția output_result afișează toate seriile de numere consecutive găsite, folosind funcția print. Fiecare serie este afișată pe o linie separată, cu numerele separate prin un singur spațiu.
Funcția main este funcția principală a programului, care apelează celelalte funcții. Mai întâi, se citește numărul n prin apelul funcției read_input. Apoi, se inițializează lista result, care va conține toate seriile de numere consecutive care adunate dau n. Pentru fiecare valoare start între 1 și n // 2 + 1, se adaugă numere consecutive în lista series, începând de la start. Dacă suma numerelor din lista series este egală cu n, atunci seria este adăugată în lista result. În caz contrar, se înlătură primele elemente ale seriei până când suma numerelor este mai mică sau egală cu n. Dacă suma numerelor din seria actualizată este egală cu n, atunci seria este adăugată în lista result. La final, lista result este afișată prin apelul funcției output_result.
Funcția if __name__ == "__main__": asigură faptul că funcția main este apelată doar dacă programul este executat ca script și nu ca modul.