Documente Academic
Documente Profesional
Documente Cultură
a) Determinați cel mai mare dintre numerele date care are suma cifrelor minimă.
b) Aflați cel mai mic număr dintre numerele date care are în scrierea sa un număr
maxim de cifre consecutive (de exemplu 25613 are în scrierea sa un număr maxim de 3
cifre consecutive:1,2,3).
c) Aflați cifra comună cât mai multor numere din șir. Dacă sunt mai multe asemenea
cifre se vor afișa toate în ordine crescătoare.
== Date de intrare ==
== Date de ieșire ==
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse
corect." Fișierul de ieșire '''cifre11.out''' va conține pe prima linie cel mai
mare număr din șir cu suma cifrelor minimă, pe a doua linie cel mai mic număr cu
număr maxim de cifre consecutive în scrierea sa, iar pe a treia linie cifrele ce
apar în scrierea a cât mai multor numere din șir, separate prin spațiu .
== Exemple ==
===Exemplul 1===
; ''douamii17.in''
:5
:1 2 18 23 9
; ''ecran''
:Datele sunt introduse corect.
; ''douamii17.out''
:1
:1
:0
:1
:1
===Exemplul 2===
; ''douamii17.in''
:5
:10 20 30 40 50
; ''ecran''
:Datele sunt introduse corect.
; ''douamii17.out''
:0
:0
:0
:0
:0
===Exemplul 3===
; ''douamii17.in''
:3
:-5 1000000000 2000000000
; ''ecran''
:Datele nu corespund restricțiilor impuse.
; ''douamii17.out''
:
<br>
== Rezolvare ==
<syntaxhighlight lang="python" line="1">
# 1902 - DouaMii17
import math
def calculate_divisors():
b = [0] * 20001
p = []
a = [0] * (500000001)
nr = 0
i = 2
while nr < 2017:
if b[i] == 0:
nr += 1
p.append(i)
j = i * i
while j < 20000:
b[j] = 1
j = j + i
i += 1
a[1] = 1
for i in range(2017):
j = p[i]
while j < 500000000:
a[j] = 1
j = j * p[i]
return a
if __name__ == "__main__":
with open("douamii17.in") as fin:
n = int(fin.readline().strip())
nums = list(map(int, fin.readline().strip().split()))
if not is_valid(n, nums):
print("Datele nu corespund restricțiilor impuse.")
exit(0)
divisors = calculate_divisors()
print("Datele sunt introduse corect.")
with open("douamii17.out", "w") as fout:
for num in nums:
fout.write(str(divisors[num]) + "\n")
</syntaxhighlight>
==Explicatie==
is_valid(n, nums): Această funcție primește doi parametri, n și nums. Verifică dacă
numărul de elemente din lista nums este cel puțin 1 și cel mult 1.000.000 și dacă
fiecare element din listă este mai mare decât 0 și mai mic decât 500.000.000. În
cazul în care aceste condiții sunt îndeplinite, funcția returnează True, în caz
contrar returnează False.
main(): Această funcție este punctul de intrare în program. Verifică dacă datele de
intrare sunt valide, apoi apelează funcția calculate_divisors() pentru a obține
șirul de divizori. Rezultatul este scris în fișierul douamii17.out și afișat pe
ecran.