0298 - SumSec: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
 
Line 10: Line 10:
== Date de ieșire ==  
== Date de ieșire ==  
Dacă datele sunt introduse corect, pe ecran se va afișa:  
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."'''.
'''"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 33: Line 33:
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele nu corespund restricțiilor impuse.
: sumsec.out
 
: 21
 




Line 71: Line 71:
          
          
     return sum
     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__":
if __name__ == "__main__":
     with open("sumsec.in", "r") as f:
     n = int(input())
        n = int(f.readline().strip())
    a = list(map(int, input().split()))
        a = []
 
        for i in range(n):
     if not validate_input(n, a):
            line = f.readline().strip().split()
         print("Datele nu corespund restricțiilor impuse.")
            for x in line:
    else:
                a.append(int(x))
        print("Datele sunt introduse corect.")
   
        result = solve_sumsec(n, a)
     for x in a:
        with open("sumsec.out", "w") as f:
         if x < 1 or x > 999999999:
            f.write(str(result))
            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))




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


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


Î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".
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 | edit source]

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

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

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

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

Exemplu 1[edit | edit source]

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

Exemplu 2[edit | edit source]

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



Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

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

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