0298 - SumSec: Difference between revisions
No edit summary |
No edit summary |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 9: | Line 9: | ||
== Date de ieșire == | == Date de ieșire == | ||
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 29: | Line 42: | ||
# 0298 - SumSec | # 0298 - SumSec | ||
def is_prime(n): | |||
if n < 2: | |||
def | return False | ||
if n == 2: | |||
n = | return True | ||
if n % 2 == 0: | |||
if | |||
return False | return False | ||
for | for i in range(3, int(n ** 0.5) + 1, 2): | ||
if | if n % i == 0: | ||
return False | return False | ||
return True | return True | ||
def | def solve_sumsec(n, a): | ||
first_prime = -1 | |||
last_prime = -1 | |||
for i in range( | for i in range(n): | ||
if | if is_prime(a[i]): | ||
if | 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 | def validate_input(n, a): | ||
if not (1 <= n <= 10000): | |||
return False | |||
return | if any(num < 1 or num > 999999999 for num in a): | ||
return False | |||
return True | |||
if __name__ == "__main__": | if __name__ == "__main__": | ||
n = int(input()) | |||
a = list(map(int, input().split())) | |||
if | |||
print(" | if not validate_input(n, a): | ||
print("Datele nu corespund restricțiilor impuse.") | |||
else: | else: | ||
print(" | 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(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 if __name__ == "__main__": | 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>
- 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".