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

Fişierul de ieşire sumsec.out va conţine pe prima linie numărul S, reprezentând suma calculată.


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
53


Rezolvare

Rezolvare ver. 1

# 0298 - SumSec

import math

def citire_date():
    with open("sumsec.in", "r") as fin:
        n = int(fin.readline())
        v = []
        for i in range(n):
            v += list(map(int, fin.readline().split()))
    return v

def este_prim(x):
    if x < 2:
        return False
    for d in range(2, int(math.sqrt(x)) + 1):
        if x % d == 0:
            return False
    return True

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

    suma = 0
    for i in range(primul + 1, ultimul):
        suma += v[i]
    return suma

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

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. In if __name__ == "__main__": apelam cele trei functii in ordinea prezentata mai sus, si afisam un mesaj corespunzator, in functie de rezultatul validarii.