0352 - Sum Cons: Difference between revisions

From Bitnami MediaWiki
Paul Ungur (talk | contribs)
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...
 
Paul Ungur (talk | contribs)
No edit summary
Line 23: Line 23:
==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==
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.

Revision as of 16:20, 26 April 2023

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 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")

</syntaxhighlight>