0298 - SumSec

De la Universitas MediaWiki

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."' 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

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

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