0298 - SumSec: Difference between revisions
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/298/sumsec 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... |
No edit summary |
||
Line 29: | Line 29: | ||
# 0298 - SumSec | # 0298 - SumSec | ||
def | import math | ||
if | |||
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 | return False | ||
for | for d in range(2, int(math.sqrt(x)) + 1): | ||
if | if x % d == 0: | ||
return False | return False | ||
return True | 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 | |||
print( | if __name__ == "__main__": | ||
v = citire_date() | |||
suma = rezolvare(v) | |||
if validare(suma): | |||
print("Suma este corecta!") | |||
else: | |||
print("Suma nu este corecta!") | |||
</syntaxhighlight> | </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. | |||
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 20:00, 17 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
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
<syntaxhighlight lang="python" line>
- 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!")
</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. In if __name__ == "__main__": apelam cele trei functii in ordinea prezentata mai sus, si afisam un mesaj corespunzator, in functie de rezultatul validarii.