0298 - SumSec: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
Line 9: Line 9:


== Date de ieșire ==  
== Date de ieșire ==  
Fişierul de ieşire sumsec.out va conţine pe prima linie numărul S, reprezentând suma calculată.
Dacă datele sunt introduse corect, pe ecran se va afișa:
'''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul c''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''.




Line 21: Line 22:
: 12 10 15 7 17 10 19 14
: 12 10 15 7 17 10 19 14
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: 53
: 53


Line 29: Line 31:
# 0298 - SumSec
# 0298 - SumSec


import math
def citire():
    n, k = map(int, input().split())
    sir = list(map(int, input().split()))
    return n, k, sir


def citire_date():
def rezolvare(n, k, sir):
     with open("sumsec.in", "r") as fin:
     if k < 1 or k > n:
         n = int(fin.readline())
         return None  # Returnam None daca k nu respecta conditiile
        v = []
    secventa = []
        for i in range(n):
    secvente = 0
            v += list(map(int, fin.readline().split()))
    return v


def este_prim(x):
    for i in range(n):
    if x < 2:
        if sir[i] % 2 == 0:
         return False
            continue  # Ignoram elementele pare
    for d in range(2, int(math.sqrt(x)) + 1):
         if len(secventa) == 0 or len(secventa[-1]) == k:
         if x % d == 0:
            secventa.append([sir[i]]) # Cream o secventa noua
             return False
            secvente += 1
    return True
         else:
             secventa[-1].append(sir[i])  # Adaugam elementul la ultima secventa


def rezolvare(v):
     return secvente
     primul = -1
    ultimul = -1
    for i in range(len(v)):
        if este_prim(v[i]):
            if primul == -1:
                primul = i
            ultimul = i


     suma = 0
if __name__ == '__main__':
    for i in range(primul + 1, ultimul):
     try:
         suma += v[i]
        n, k, sir = citire()
     return suma
        rez = rezolvare(n, k, sir)
        if rez is not None:
            print("Datele sunt introduse corect.")
            print(rez)
         else:
            print("Datele nu corespund restricțiilor impuse.")
     except ValueError:
        print("Datele nu corespund formatului cerut.")  # In cazul in care input-ul nu este corect din punct de vedere al formatului


def validare(suma):
    with open("sumsec.out", "r") as fout:
        s_corect = int(fout.readline().strip())
        return suma == s_corect
if __name__ == "__main__":
    v = citire_date()
    suma = rezolvare(v)
    if validare(suma):
        print("Suma este corecta!")
    else:
        print("Suma nu este corecta!")




Line 85: Line 77:
In functia rezolvare cautam primul si ultimul element prim din vectorul v, si apoi calculam suma elementelor din secventa determinata de acestea. Observam ca secventa incepe de la primul+1 si se termina inaintea lui ultimul, deoarece primul si ultimul element prim nu fac parte din secventa.
In functia rezolvare cautam primul si ultimul element prim din vectorul v, si apoi calculam suma elementelor din secventa determinata de acestea. Observam ca secventa incepe de la primul+1 si se termina inaintea lui ultimul, deoarece primul si ultimul element prim nu fac parte din secventa.
Functia validare compara valoarea calculata cu cea din fisierul "sumsec.out" si returneaza True daca acestea coincid, si False altfel.
Functia validare compara valoarea calculata cu cea din fisierul "sumsec.out" si returneaza True daca acestea coincid, si False altfel.
Am adăugat o verificare suplimentară în funcția rezolvare() pentru a returna None dacă k nu respectă restricțiile cerute. Apoi, în blocul if __name__ == '__main__', verificăm dacă rezultatul returnat este diferit de None și afișăm mesajul corespunzător. Am introdus, de asemenea, un bloc try-except pentru a gestiona cazul în care valorile de intrare nu sunt în formatul așteptat.
In if __name__ == "__main__": apelam cele trei functii in ordinea prezentata mai sus, si afisam un mesaj corespunzator, in functie de rezultatul validarii.
In if __name__ == "__main__": apelam cele trei functii in ordinea prezentata mai sus, si afisam un mesaj corespunzator, in functie de rezultatul validarii.

Revision as of 18:22, 27 April 2023

Sursa: 0298 - SumSec


Cerinţa

Se dă un şir format din n elemente, numere naturale. Calculaţi suma elementelor din secvenţa determinată de primul şi ultimul element prim.

Date de intrare

Fişierul de intrare sumsec.in conţine pe prima linie numărul n; urmează cele n elemente ale vectorului, dispuse pe mai multe linii şi separate prin spaţii.


Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou numărul c, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".


Restricţii şi precizări

  • 1 ≤ n ≤ 1000
  • elementele şirului vor avea cel mult 9 cifre
  • şirul va conţine cel puţin un element prim

Exemplu

Intrare
8
12 10 15 7 17 10 19 14
Ieșire
Datele nu corespund restricțiilor impuse.
53


Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0298 - SumSec

def citire():

   n, k = map(int, input().split())
   sir = list(map(int, input().split()))
   return n, k, sir

def rezolvare(n, k, sir):

   if k < 1 or k > n:
       return None  # Returnam None daca k nu respecta conditiile
   secventa = []
   secvente = 0
   for i in range(n):
       if sir[i] % 2 == 0:
           continue  # Ignoram elementele pare
       if len(secventa) == 0 or len(secventa[-1]) == k:
           secventa.append([sir[i]])  # Cream o secventa noua
           secvente += 1
       else:
           secventa[-1].append(sir[i])  # Adaugam elementul la ultima secventa
   return secvente

if __name__ == '__main__':

   try:
       n, k, sir = citire()
       rez = rezolvare(n, k, sir)
       if rez is not None:
           print("Datele sunt introduse corect.")
           print(rez)
       else:
           print("Datele nu corespund restricțiilor impuse.")
   except ValueError:
       print("Datele nu corespund formatului cerut.")  # In cazul in care input-ul nu este corect din punct de vedere al formatului


</syntaxhighlight>

Explicatie Rezolvare

Citim datele de intrare si construim vectorul de numere. Cautam primul si ultimul element prim din vector. Determinam secventa de numere intre primul si ultimul element prim. Calculam suma elementelor din secventa determinata la pasul anterior. Functia citire_date citeste datele de intrare din fisierul "sumsec.in" si returneaza vectorul de numere v. Functia este_prim verifica daca un numar este prim sau nu. In functia rezolvare cautam primul si ultimul element prim din vectorul v, si apoi calculam suma elementelor din secventa determinata de acestea. Observam ca secventa incepe de la primul+1 si se termina inaintea lui ultimul, deoarece primul si ultimul element prim nu fac parte din secventa. Functia validare compara valoarea calculata cu cea din fisierul "sumsec.out" si returneaza True daca acestea coincid, si False altfel. Am adăugat o verificare suplimentară în funcția rezolvare() pentru a returna None dacă k nu respectă restricțiile cerute. Apoi, în blocul if __name__ == '__main__', verificăm dacă rezultatul returnat este diferit de None și afișăm mesajul corespunzător. Am introdus, de asemenea, un bloc try-except pentru a gestiona cazul în care valorile de intrare nu sunt în formatul așteptat. In if __name__ == "__main__": apelam cele trei functii in ordinea prezentata mai sus, si afisam un mesaj corespunzator, in functie de rezultatul validarii.