2024 - Divizor 112: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(One intermediate revision by the same user not shown)
Line 35: Line 35:
== 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.