0298 - SumSec: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
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...
 
Flaviu (talk | contribs)
No edit summary
Line 29: Line 29:
# 0298 - SumSec
# 0298 - SumSec


def is_prime(n):
import math
     if n < 2:
 
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 i in range(2, int(n**0.5)+1):
     for d in range(2, int(math.sqrt(x)) + 1):
         if n % i == 0:
         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


n = int(input())
    suma = 0
numbers = list(map(int, input().split()))
    for i in range(primul + 1, ultimul):
        suma += v[i]
    return suma


sum_of_seq = 0
def validare(suma):
for i in range(n):
     with open("sumsec.out", "r") as fout:
     if is_prime(numbers[i]):
         s_corect = int(fout.readline().strip())
         for j in range(i+1, n):
        return suma == s_corect
            if is_prime(numbers[j]):
                sum_of_seq += sum(numbers[i:j+1])
                break


print(sum_of_seq)
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>

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


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