0352 - Sum Cons: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: ==Cerinţa== Se citește numărul natural nenul <span style=“color: red”>n</span>. Determinați toate modalitățile de a-l scrie pe <span style=“color: red”>n</span> ca sumă de cel puțin două numere naturale consecutive nenule. ==Date de intrare== Programul citește de la tastatură numărul <span style=“color: red”>n</span>. ==Date de ieşire== Programul afișează pe ecran descompunerile cerute, câte o descompunere pe o linie a ecranului, în ordine cresc...)
 
Fără descriere a modificării
 
(Nu s-au afișat 2 versiuni intermediare efectuate de același utilizator)
Linia 6: Linia 6:


==Date de ieşire==
==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.
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==
==Restricţii şi precizări==
Linia 14: Linia 14:
==Exemplu:==
==Exemplu:==
Date de intrare
Date de intrare
30
: 30


Date de ieșire
Date de ieșire
9 10 11  
: Date de intrare valide
6 7 8 9  
: 9 10 11  
4 5 6 7 8
: 6 7 8 9  
: 4 5 6 7 8


==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validate_input(n):
def validare(n):
    """
     if not (1 <= n <= 10_000_000):
    Verifică dacă numărul dat este un număr natural nenul și se află în intervalul specificat.
         return False
    """
    return True
     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():
def gasire_secventa(n):
     """
     for i in range(1, n // 2 + 1):
    Citește numărul n de la tastatură și verifică dacă datele sunt corecte.
        a = int((2 * n - i - i ** 2) / (2 * i + 2))
    """
        if a >= 1 and n == (i + 1) * (2 * a + i) // 2:
    n = int(input("Introduceți numărul n: "))
            for k in range(i + 1):
    validate_input(n)
                print(k + a, end=" ")
    return n
            print()




def output_result(result):
if __name__ == '__main__':
     """
     n = int(input())
    Afișează toate seriile de numere consecutive găsite.
    """
    for series in result:
        print(" ".join(map(str, series)))


 
     if validare(n):
def main():
         print("Date de intrare valide")
     n = read_input()
         gasire_secventa(n)
 
    else:
    result = []
        print("Date de intrare invalide")
    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>
</syntaxhighlight>
 
==Explicatie cod:==
==Explicatie==
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.
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 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.
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.
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.
 
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.

Versiunea curentă din 29 iunie 2023 19:06

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.