0298 - SumSec: Diferență între versiuni

De la Universitas MediaWiki
Fără descriere a modificării
Fără descriere a modificării
 
(Nu s-au afișat 6 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 10: Linia 10:
== Date de ieșire ==  
== Date de ieșire ==  
Dacă datele sunt introduse corect, pe ecran se va afișa:  
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."'''.
'''"Datele sunt introduse corect."''''' și fișierul 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."''' si fisierul sumsec.out nu va fi generat.
 


== Restricţii şi precizări ==
== Restricţii şi precizări ==
Linia 17: Linia 16:
* elementele şirului vor avea cel mult 9 cifre
* elementele şirului vor avea cel mult 9 cifre
* şirul va conţine cel puţin un element prim
* şirul va conţine cel puţin un element prim
== Exemplu ==
== Exemplu 1 ==
; Intrare
; 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
: 8
: 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.
: Datele nu corespund restricțiilor impuse.
: 53
 
 




Linia 31: Linia 42:
# 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
     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 rezolvare(n, k, sir):
def solve_sumsec(n, a):
     if k < 1 or k > n:
     first_prime = -1
         return None  # Returnam None daca k nu respecta conditiile
    last_prime = -1
     secventa = []
    for i in range(n):
     secvente = 0
        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
 
 
def validate_input(n, a):
    if not (1 <= n <= 10000):
        return False
    if any(num < 1 or num > 999999999 for num in a):
        return False
    return True


    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__":
     n = int(input())
    a = list(map(int, input().split()))


if __name__ == '__main__':
    if not validate_input(n, a):
    try:
         print("Datele nu corespund restricțiilor impuse.")
        n, k, sir = citire()
    else:
         rez = rezolvare(n, k, sir)
        print("Datele sunt introduse corect.")
        if rez is not None:
        result = solve_sumsec(n, a)
            print("Datele sunt introduse corect.")
         with open("sumsec.out", "w") as f:
            print(rez)
            f.write(str(result))
         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




Linia 69: Linia 97:
</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
Citim datele de intrare si construim vectorul de numere.
Funcția is_prime(n) primește ca argument un număr întreg n și verifică dacă acesta este un număr prim. Funcția parcurge toate numerele întregi impare de la 3 la radical din n, verificând dacă n este divizibil cu vreunul dintre acestea. Dacă n este divizibil cu un număr diferit de 1 și de n, atunci n nu este prim și funcția returnează False. În caz contrar, funcția returnează True.
Cautam primul si ultimul element prim din vector.
 
Determinam secventa de numere intre primul si ultimul element prim.
Funcția solve_sumsec(n, a) primește ca argumente un număr întreg n și un vector a cu n elemente și calculează suma elementelor din secvența determinată de primul și ultimul element prim din vectorul dat.
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 primul rând, funcția identifică prima și ultima poziție din vectorul a unde se găsesc elemente prime și le reține în variabilele first_prime și last_prime. Dacă nu există cel puțin o astfel de poziție, atunci funcția returnează mesajul "Datele nu corespund restricțiilor impuse."
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.
Dacă există cel puțin o poziție cu un element prim, atunci funcția calculează suma elementelor din secvența determinată de primul și ultimul element prim. Această secvență este reprezentată de toate elementele din vectorul a care se află între pozițiile first_prime și last_prime, cu excepția primului și ultimului element prim din vector.
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 blocul if __name__ == "__main__": se citesc datele de intrare din fișierul "sumsec.in", se validează conform restricțiilor problemei, se afișează un mesaj corespunzător și se apelează funcția solve_sumsec() pentru a rezolva problema și a obține rezultatul dorit. Acest rezultat este scris apoi în fișierul "sumsec.out".
In if __name__ == "__main__": apelam cele trei functii in ordinea prezentata mai sus, si afisam un mesaj corespunzator, in functie de rezultatul validarii.

Versiunea curentă din 14 mai 2023 20:21

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." și fișierul 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." si fisierul sumsec.out nu va fi generat.

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.



Rezolvare

Rezolvare ver. 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


def validate_input(n, a):
    if not (1 <= n <= 10000):
        return False
    if any(num < 1 or num > 999999999 for num in a):
        return False
    return True


if __name__ == "__main__":
    n = int(input())
    a = list(map(int, input().split()))

    if not validate_input(n, a):
        print("Datele nu corespund restricțiilor impuse.")
    else:
        print("Datele sunt introduse corect.")
        result = solve_sumsec(n, a)
        with open("sumsec.out", "w") as f:
            f.write(str(result))

Explicatie Rezolvare

Funcția is_prime(n) primește ca argument un număr întreg n și verifică dacă acesta este un număr prim. Funcția parcurge toate numerele întregi impare de la 3 la radical din n, verificând dacă n este divizibil cu vreunul dintre acestea. Dacă n este divizibil cu un număr diferit de 1 și de n, atunci n nu este prim și funcția returnează False. În caz contrar, funcția returnează True.

Funcția solve_sumsec(n, a) primește ca argumente un număr întreg n și un vector a cu n elemente și calculează suma elementelor din secvența determinată de primul și ultimul element prim din vectorul dat.

În primul rând, funcția identifică prima și ultima poziție din vectorul a unde se găsesc elemente prime și le reține în variabilele first_prime și last_prime. Dacă nu există cel puțin o astfel de poziție, atunci funcția returnează mesajul "Datele nu corespund restricțiilor impuse."

Dacă există cel puțin o poziție cu un element prim, atunci funcția calculează suma elementelor din secvența determinată de primul și ultimul element prim. Această secvență este reprezentată de toate elementele din vectorul a care se află între pozițiile first_prime și last_prime, cu excepția primului și ultimului element prim din vector.

In blocul if __name__ == "__main__": se citesc datele de intrare din fișierul "sumsec.in", se validează conform restricțiilor problemei, se afișează un mesaj corespunzător și se apelează funcția solve_sumsec() pentru a rezolva problema și a obține rezultatul dorit. Acest rezultat este scris apoi în fișierul "sumsec.out".