0298 - SumSec: Difference between revisions
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." | '''"Datele sunt introduse corect."''''' 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."'''. | ||
== Restricţii şi precizări == | == Restricţii şi precizări == |
Revision as of 19:34, 14 May 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
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect." 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.".
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 1
- Intrare
- sumsec.in
- 8
- 12 10 15 7 17 10 19 14
- Ieșire
- Datele sunt introduse corect.
- sumsec.out
- 53
Exemplu 2
- Intrare
- sumsec.in
- 8
- 12 10 15 7 17 10 19 14
- Ieșire
- Datele nu corespund restricțiilor impuse.
- sumsec.out
- 21
Rezolvare
Rezolvare ver. 1
<syntaxhighlight lang="python" line>
- 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
if __name__ == "__main__":
with open("sumsec.in", "r") as f: n = int(f.readline().strip()) a = [] for i in range(n): line = f.readline().strip().split() for x in line: a.append(int(x)) for x in a: if x < 1 or x > 999999999: 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>
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 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.
Î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".