0516 - SumSec1
Sursa: https://www.pbinfo.ro/probleme/516/sumsec1 0516 - SumSec1]
Cerinţa
Se dă un vector format din n elemente, numere naturale. Calculați suma elementelor din secvența determinată de primul și ultimul element impar.
Date de intrare
Programul va citi de la tastatură numărul n, apoi cele n elemente ale vectorului.
Date de ieșire
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou va fișa pe ecran 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 vectorului vor fi mai mici decât 1.000.000
- vectorul va conţine cel puțin un element impar
Exemplu 1
- Intrare
- Introduceti valoarea lui n: 8
- 12 10 15 6 7 10 19 14
- Ieșire
- Datele sunt introduse correct.
- 5 4
Exemplu 2
- Intrare
- Introduceti valoarea lui n: 2
- 1 2 3 4 5 6
- Ieșire
- Datele nu corespund restricțiilor impuse.
- 6 7
Rezolvare
Rezolvare ver. 1
<syntaxhighlight lang="python" line>
- 0516 - SumSec1
def validate_input(n, v):
if n < 1 or n > 1000: print("Datele nu corespund restricțiilor impuse.") return False
has_odd = False for i in range(n): if v[i] < 0 or v[i] >= 1000000: print("Datele nu corespund restricțiilor impuse.") return False if v[i] % 2 == 1: has_odd = True if not has_odd: print("Datele nu corespund restricțiilor impuse.") return False
print("Datele sunt introduse corect.") return True
def calculate_sum(n, v):
start = None end = None
for i in range(n): if v[i] % 2 == 1: if start is None: start = i else: end = i
return sum(v[start:end+1])
def main():
n = int(input("Introduceti valoarea lui n: ")) v = list(map(int, input("Introduceti valorile din vector: ").split()))
if not validate_input(n, v): return
print(calculate_sum(n, v))
if __name__ == "__main__":
main()
</syntaxhighlight>
Explicație rezolvare
Funcția validate_input primește patru argumente: n, v, A și B. Această funcție are rolul de a valida datele de intrare. Verificările pe care le face includ verificarea dacă n se încadrează în intervalul [1, 1000], dacă fiecare element al vectorului v se încadrează în intervalul [1, 1.000.000], dacă vectorul v conține cel puțin un element impar și dacă A și B se încadrează în intervalul [1, 2.000.000.000] și dacă A este mai mic sau egal cu B. Dacă toate verificările trec, atunci funcția afișează pe ecran "Datele sunt introduse corect." și returnează True. În caz contrar, funcția afișează pe ecran "Datele nu corespund restricțiilor impuse." și returnează False.
Funcția sum_secventa primește trei argumente: n, v și valid. Această funcție calculează suma elementelor din secvența determinată de primul și ultimul element impar din vectorul v. Dacă parametrul valid este False, adică datele de intrare nu au trecut validarea, funcția afișează pe ecran "Datele nu corespund restricțiilor impuse." și returnează None. În caz contrar, funcția calculează prima și ultima poziție cu numere impare în vectorul v, apoi calculează suma elementelor din secvența respectivă și afișează pe ecran această valoare.
În funcția main se citesc datele de intrare, se validează cu ajutorul funcției validate_input, și se calculează suma cu ajutorul funcției sum_secventa. Dacă valoarea returnată de sum_secventa este diferită de None, adică dacă datele de intrare au trecut validarea și s-a putut calcula suma, atunci se afișează pe ecran "Datele sunt introduse corect." și valoarea sumei. În caz contrar, se afișează doar "Datele nu corespund restricțiilor impuse."