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
 
(8 intermediate revisions by 2 users not shown)
Line 9: Line 9:


== Date de ieșire ==  
== Date de ieșire ==  
Fişierul de ieşire sumsec.out va conţine pe prima linie numărul S, reprezentând suma calculată.
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 ==
== Restricţii şi precizări ==
Line 16: Line 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
: 8
: 12 10 15 7 17 10 19 14
: 12 10 15 7 17 10 19 14
; Ieșire
; Ieșire
: Datele sunt introduse corect.
: sumsec.out
: 53
: 53
== Exemplu 2 ==
; Intrare
: sumsec.in
: 8
: 12 10 15 7 17 10 19 14
; Ieșire
: Datele nu corespund restricțiilor impuse.




Line 32: Line 45:
     if n < 2:
     if n < 2:
         return False
         return False
     for i in range(2, int(n**0.5)+1):
    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:
         if n % i == 0:
             return False
             return False
     return True
     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


n = int(input())
numbers = list(map(int, input().split()))


sum_of_seq = 0
def validate_input(n, a):
for i in range(n):
     if not (1 <= n <= 10000):
     if is_prime(numbers[i]):
         return False
         for j in range(i+1, n):
    if any(num < 1 or num > 999999999 for num in a):
            if is_prime(numbers[j]):
        return False
                sum_of_seq += sum(numbers[i:j+1])
    return True
                break
 
 
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))


print(sum_of_seq)




</syntaxhighlight>
</syntaxhighlight>
== 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".

Latest revision as of 20:21, 14 May 2023

Sursa: 0298 - SumSec


Cerinţa[edit]

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[edit]

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[edit]

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[edit]

  • 1 ≤ n ≤ 1000
  • elementele şirului vor avea cel mult 9 cifre
  • şirul va conţine cel puţin un element prim

Exemplu 1[edit]

Intrare
sumsec.in
8
12 10 15 7 17 10 19 14
Ieșire
Datele sunt introduse corect.
sumsec.out
53

Exemplu 2[edit]

Intrare
sumsec.in
8
12 10 15 7 17 10 19 14
Ieșire
Datele nu corespund restricțiilor impuse.



Rezolvare[edit]

Rezolvare ver. 1[edit]

<syntaxhighlight lang="python" line>

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


</syntaxhighlight>

Explicatie Rezolvare[edit]

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