0352 - Sum Cons

De la Universitas MediaWiki

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

Dacă datele sunt introduse corect, pe ecran se va afișa: "Date de intrare valide.", apoi 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. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Date de intrare invalide".

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

Date de intrare valide
9 10 11
6 7 8 9
4 5 6 7 8

Rezolvare

def validare(n):
    if not (1 <= n <= 10_000_000):
        return False
    return True


def gasire_secventa(n):
    for i in range(1, n // 2 + 1):
        a = int((2 * n - i - i ** 2) / (2 * i + 2))
        if a >= 1 and n == (i + 1) * (2 * a + i) // 2:
            for k in range(i + 1):
                print(k + a, end=" ")
            print()


if __name__ == '__main__':
    n = int(input())

    if validare(n):
        print("Date de intrare valide")
        gasire_secventa(n)
    else:
        print("Date de intrare invalide")

Explicatie cod:

Funcția validare(n) primește un parametru n de tip întreg și verifică dacă acesta se află în intervalul [1, 10_000_000]. Dacă condiția este îndeplinită, funcția returnează True, altfel returnează False. Funcția gasire_secventa(n) primește un parametru n de tip întreg și găsește secvențele de numere care satisfac o anumită condiție matematică. Aceasta parcurge un interval de la 1 până la jumătatea valorii lui n și verifică dacă există un număr a astfel încât formula (i + 1) * (2 * a + i) // 2 să fie egală cu n, unde i este un contor. Dacă găsește o astfel de secvență, o afișează pe ecran. În blocul if __name__ == '__main__':, se citește n de la intrare folosind funcția input(). Se validează datele de intrare utilizând funcția validare(n). Dacă datele de intrare sunt valide, se afișează un mesaj de confirmare, se apelează funcția gasire_secventa(n) și se afișează secvența găsită pe ecran. Altfel, se afișează un mesaj de eroare. Codul primește un număr de la intrare, validează datele și găsește secvențele care îndeplinesc condiția specificată. Acestea sunt afișate pe ecran.