2024 - Divizor 112: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinta == Se dă un şir format din n numere naturale nenule. Aflaţi cel mai mic număr natural, diferit de 1, care divide un număr maxim de numere din şir. == Date de intrare == Fișierul de intrare divizor112.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule separate prin spații. == Date de iesire == Fișierul de ieșire divizor112.txt va conține pe prima linie cel mai mic număr natural, diferit de 1, care divide un număr m...
 
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Cerinta ==
== Cerinta ==


Se dă un şir format din n numere naturale nenule. Aflaţi cel mai mic număr natural, diferit de 1, care divide un număr maxim de numere din şir.
Se dă un şir format din '''n''' numere naturale nenule. Aflaţi cel mai mic număr natural, diferit de 1, care divide un număr maxim de numere din şir.


== Date de intrare ==
== Date de intrare ==


Fișierul de intrare divizor112.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule separate prin spații.
Fișierul de intrare '''divizor112in.txt''' conține pe prima linie numărul '''n''', iar pe a doua linie '''n''' numere naturale nenule separate prin spații.


== Date de iesire ==
== Date de iesire ==


Fișierul de ieșire divizor112.txt va conține pe prima linie cel mai mic număr natural, diferit de 1, care divide un număr maxim de numere din şir.
Fișierul de ieșire '''divizor112out.txt''' va conține pe prima linie cel mai mic număr natural, diferit de 1, care divide un număr maxim de numere din şir.


== Restrictii si precizari ==
== Restrictii si precizari ==


*1 n 100.000
*1 ⩽ n ⩽ 100.000
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;divizor112in.txt
:5
:5
:1 2 3 4 5
:1 2 3 4 5


;Iesire
;divizor112out.txt
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:2
:2


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;divizor112in.txt
:-4
:-4
:1000001 64 -89 43580
:1000001 64 -89 43580
;Iesire
;divizor112out.txt
;Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse




== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def divizor_maxim(n, numere):
def get_prime_factors(num):
     # Inițializează un dicționar pentru a număra de câte ori apare fiecare divizor
     factors = {}
     frecventa_divizori = {}
    divisor = 2
     while num > 1:
        while num % divisor == 0:
            num //= divisor
            factors[divisor] = factors.get(divisor, 0) + 1
        divisor += 1
    return factors


     # Parcurge fiecare număr din șir
def find_max_divisor(nums):
     for numar in numere:
     prime_factors_count = {}
        # Calculează divizorii numărului
     max_divisor = None
        divizori = [i for i in range(2, numar + 1) if numar % i == 0]
    max_count = 0


         # Actualizează frecvența divizorilor în dicționar
    for num in nums:
         for divizor in divizori:
         factors = get_prime_factors(num)
             if divizor in frecventa_divizori:
         for factor, count in factors.items():
                frecventa_divizori[divizor] += 1
             prime_factors_count[factor] = max(prime_factors_count.get(factor, 0), count)
            else:
                frecventa_divizori[divizor] = 1


     # Găsește divizorul cu cea mai mare frecvență
     for factor, count in prime_factors_count.items():
    divizor_maxim = max(frecventa_divizori, key=frecventa_divizori.get)
        if count > max_count:
            max_count = count
            max_divisor = factor


     return divizor_maxim
     return max_divisor


def main():
def verifica_restrictii(input_file, output_file):
     # Deschide fișierul de intrare
     # Citire date de intrare
     with open("divizor112.txt", "r") as f_in:
     with open(input_file, "r") as f:
         n = int(f_in.readline())
         n = int(f.readline())
         numere = list(map(int, f_in.readline().split()))
         numbers = list(map(int, f.readline().split()))


     # Calculează divizorul cu cea mai mare frecvență
     # Apelare funcție de rezolvare
     rezultat = divizor_maxim(n, numere)
     result = find_max_divisor(numbers)


     # Deschide fișierul de ieșire
     # Verificare restricții
    with open("divizor112.txt", "w") as f_out:
    if 1 <= n <= 100000 and all(1 <= num < 1000000 for num in numbers):
        # Scrie rezultatul în fișierul de ieșire
        # Citire rezultat așteptat
        f_out.write(str(rezultat) + "\n")
        with open(output_file, "r") as g:
            result_asteptat = int(g.readline().strip())
 
        # Verificare rezultat
        if result == result_asteptat:
            print("Rezultat corect!")
        else:
            print("Rezultat incorect!")
            print("Rezultat așteptat:", result_asteptat)
            print("Rezultat obținut:", result)
    else:
        print("Date de intrare nevalide!")
 
# Citire date de intrare
with open("divizor112in.txt", "r") as f:
    n = int(f.readline())
    numbers = list(map(int, f.readline().split()))
 
# Apelare funcție de rezolvare
result = find_max_divisor(numbers)
 
# Scriere date de ieșire
with open("divizor112out.txt", "w") as g:
    g.write(str(result) + "\n")
 
# Apelare funcție de verificare
verifica_restrictii("divizor112in.txt", "divizor112out.txt")


if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 12:11, 29 December 2023

Cerinta[edit | edit source]

Se dă un şir format din n numere naturale nenule. Aflaţi cel mai mic număr natural, diferit de 1, care divide un număr maxim de numere din şir.

Date de intrare[edit | edit source]

Fișierul de intrare divizor112in.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule separate prin spații.

Date de iesire[edit | edit source]

Fișierul de ieșire divizor112out.txt va conține pe prima linie cel mai mic număr natural, diferit de 1, care divide un număr maxim de numere din şir.

Restrictii si precizari[edit | edit source]

  • 1 ⩽ n ⩽ 100.000
  • numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000

Exemplul 1[edit | edit source]

divizor112in.txt
5
1 2 3 4 5
divizor112out.txt
Datele introduse corespund restrictiilor impuse
2

Exemplul 2[edit | edit source]

divizor112in.txt
-4
1000001 64 -89 43580
divizor112out.txt
Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def get_prime_factors(num):

   factors = {}
   divisor = 2
   while num > 1:
       while num % divisor == 0:
           num //= divisor
           factors[divisor] = factors.get(divisor, 0) + 1
       divisor += 1
   return factors

def find_max_divisor(nums):

   prime_factors_count = {}
   max_divisor = None
   max_count = 0
   for num in nums:
       factors = get_prime_factors(num)
       for factor, count in factors.items():
           prime_factors_count[factor] = max(prime_factors_count.get(factor, 0), count)
   for factor, count in prime_factors_count.items():
       if count > max_count:
           max_count = count
           max_divisor = factor
   return max_divisor

def verifica_restrictii(input_file, output_file):

   # Citire date de intrare
   with open(input_file, "r") as f:
       n = int(f.readline())
       numbers = list(map(int, f.readline().split()))
   # Apelare funcție de rezolvare
   result = find_max_divisor(numbers)
   # Verificare restricții
   if 1 <= n <= 100000 and all(1 <= num < 1000000 for num in numbers):
       # Citire rezultat așteptat
       with open(output_file, "r") as g:
           result_asteptat = int(g.readline().strip())
       # Verificare rezultat
       if result == result_asteptat:
           print("Rezultat corect!")
       else:
           print("Rezultat incorect!")
           print("Rezultat așteptat:", result_asteptat)
           print("Rezultat obținut:", result)
   else:
       print("Date de intrare nevalide!")
  1. Citire date de intrare

with open("divizor112in.txt", "r") as f:

   n = int(f.readline())
   numbers = list(map(int, f.readline().split()))
  1. Apelare funcție de rezolvare

result = find_max_divisor(numbers)

  1. Scriere date de ieșire

with open("divizor112out.txt", "w") as g:

   g.write(str(result) + "\n")
  1. Apelare funcție de verificare

verifica_restrictii("divizor112in.txt", "divizor112out.txt")


</syntaxhighlight>

Explicatie[edit | edit source]

2 divide două numere din şir.