0298 - SumSec: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
Flaviu (talk | contribs)
No edit summary
Line 33: Line 33:
: 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.
: sumsec.out
: sumsec.out
: Datele nu corespund restricțiilor impuse.
: 21
: 21


Line 43: Line 43:
# 0298 - SumSec
# 0298 - SumSec


def citire():
def is_prime(n):
     n, k = map(int, input().split())
     if n < 2:
     sir = list(map(int, input().split()))
        return False
     return n, k, sir
     if n == 2:
 
        return True
def rezolvare(n, k, sir):
     if n % 2 == 0:
    if k < 1 or k > n:
        return False
        return None  # Returnam None daca k nu respecta conditiile
    for i in range(3, int(n ** 0.5) + 1, 2):
     secventa = []
        if n % i == 0:
    secvente = 0
            return False
     return True


def solve_sumsec(n, a):
    first_prime = -1
    last_prime = -1
     for i in range(n):
     for i in range(n):
         if sir[i] % 2 == 0:
         if is_prime(a[i]):
             continue  # Ignoram elementele pare
            if first_prime == -1:
        if len(secventa) == 0 or len(secventa[-1]) == k:
                first_prime = i
            secventa.append([sir[i]]) # Cream o secventa noua
             last_prime = i
            secvente += 1
   
         else:
    if first_prime == -1 or last_prime == -1:
            secventa[-1].append(sir[i])  # Adaugam elementul la ultima secventa
        return "Datele nu corespund restricțiilor impuse."
   
    sum = 0
    for i in range(first_prime + 1, last_prime):
        sum += a[i]
          
    return sum


    return secvente
if __name__ == "__main__":
 
     with open("sumsec.in", "r") as f:
if __name__ == '__main__':
         n = int(f.readline().strip())
     try:
         a = []
         n, k, sir = citire()
        for i in range(n):
         rez = rezolvare(n, k, sir)
             line = f.readline().strip().split()
        if rez is not None:
             for x in line:
             print("Datele sunt introduse corect.")
                a.append(int(x))
             print(rez)
   
         else:
    for x in a:
         if x < 1 or x > 999999999:
             print("Datele nu corespund restricțiilor impuse.")
             print("Datele nu corespund restricțiilor impuse.")
     except ValueError:
            exit()
        print("Datele nu corespund formatului cerut.") # In cazul in care input-ul nu este corect din punct de vedere al formatului
           
 
     print("Datele sunt introduse corect.")
   
    result = solve_sumsec(n, a)
    with open("sumsec.out", "w") as f:
        f.write(str(result))




</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
Citim datele de intrare si construim vectorul de numere.
Funcția is_prime primește un număr întreg n și returnează True dacă n este prim și False în caz contrar. Se verifică dacă n este mai mic decât 2, în care caz nu este prim. Dacă n este 2, este considerat prim. Dacă n este un multiplu de 2, atunci nu este prim și se returnează False. Se parcurge intervalul [3, int(n ** 0.5) + 1, 2], și dacă n este divizibil cu unul dintre aceste numere, nu este prim și se returnează False.
Cautam primul si ultimul element prim din vector.
 
Determinam secventa de numere intre primul si ultimul element prim.
Funcția solve_sumsec primește numărul de elemente din vector n și vectorul a și calculează suma elementelor din secvența determinată de primul și ultimul element prim. Se caută primul și ultimul număr prim din vectorul a. Dacă nu există niciun număr prim în vector, se returnează "Datele nu corespund restricțiilor impuse.". Altfel, se calculează suma elementelor din secvența determinată de primul și ultimul număr prim, cu excepția primului și ultimului număr 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.
În funcția main, se deschide fișierul "sumsec.in" pentru citire și se citesc datele din fișier. Se verifică dacă toate elementele vectorului a se află în intervalul [1, 999999999]. Dacă nu, se afișează "Datele nu corespund restricțiilor impuse." și se iese din program. În caz contrar, se afișează "Datele sunt introduse corect." și se calculează soluția problemei apelând funcția solve_sumsec. Soluția este scrisă în fișierul "sumsec.out".
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.

Revision as of 21:38, 13 May 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 sumsec.out va conţine pe prima linie numărul S, reprezentând suma calculată, 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 1

Intrare
sumsec.in
8
12 10 15 7 17 10 19 14
Ieșire
Datele sunt introduse corect.
sumsec.out
53

Exemplu 2

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


Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0298 - SumSec

def is_prime(n):

   if n < 2:
       return False
   if n == 2:
       return True
   if n % 2 == 0:
       return False
   for i in range(3, int(n ** 0.5) + 1, 2):
       if n % i == 0:
           return False
   return True

def solve_sumsec(n, a):

   first_prime = -1
   last_prime = -1
   for i in range(n):
       if is_prime(a[i]):
           if first_prime == -1:
               first_prime = i
           last_prime = i
   
   if first_prime == -1 or last_prime == -1:
       return "Datele nu corespund restricțiilor impuse."
   
   sum = 0
   for i in range(first_prime + 1, last_prime):
       sum += a[i]
       
   return sum

if __name__ == "__main__":

   with open("sumsec.in", "r") as f:
       n = int(f.readline().strip())
       a = []
       for i in range(n):
           line = f.readline().strip().split()
           for x in line:
               a.append(int(x))
   
   for x in a:
       if x < 1 or x > 999999999:
           print("Datele nu corespund restricțiilor impuse.")
           exit()
           
   print("Datele sunt introduse corect.")
   
   result = solve_sumsec(n, a)
   with open("sumsec.out", "w") as f:
       f.write(str(result))


</syntaxhighlight>

Explicatie Rezolvare

Funcția is_prime primește un număr întreg n și returnează True dacă n este prim și False în caz contrar. Se verifică dacă n este mai mic decât 2, în care caz nu este prim. Dacă n este 2, este considerat prim. Dacă n este un multiplu de 2, atunci nu este prim și se returnează False. Se parcurge intervalul [3, int(n ** 0.5) + 1, 2], și dacă n este divizibil cu unul dintre aceste numere, nu este prim și se returnează False.

Funcția solve_sumsec primește numărul de elemente din vector n și vectorul a și calculează suma elementelor din secvența determinată de primul și ultimul element prim. Se caută primul și ultimul număr prim din vectorul a. Dacă nu există niciun număr prim în vector, se returnează "Datele nu corespund restricțiilor impuse.". Altfel, se calculează suma elementelor din secvența determinată de primul și ultimul număr prim, cu excepția primului și ultimului număr prim.

În funcția main, se deschide fișierul "sumsec.in" pentru citire și se citesc datele din fișier. Se verifică dacă toate elementele vectorului a se află în intervalul [1, 999999999]. Dacă nu, se afișează "Datele nu corespund restricțiilor impuse." și se iese din program. În caz contrar, se afișează "Datele sunt introduse corect." și se calculează soluția problemei apelând funcția solve_sumsec. Soluția este scrisă în fișierul "sumsec.out".