2024 - Divizor 112: Difference between revisions

From Bitnami MediaWiki
 
Line 61: Line 61:


     return max_divisor
     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!")


# Citire date de intrare
# Citire date de intrare
with open("divizor112in.txt", "r") as input_file:
with open("divizor112in.txt", "r") as f:
     n = int(input_file.readline())
     n = int(f.readline())
     numbers = list(map(int, input_file.readline().split()))
     numbers = list(map(int, f.readline().split()))


# Rezolvare
# Apelare funcție de rezolvare
result = find_max_divisor(numbers)
result = find_max_divisor(numbers)


# Scriere date de ieșire
# Scriere date de ieșire
with open("divizor112out.txt", "w") as output_file:
with open("divizor112out.txt", "w") as g:
     output_file.write(str(result))
     g.write(str(result) + "\n")
 
# Apelare funcție de verificare
verifica_restrictii("divizor112in.txt", "divizor112out.txt")
 


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 12:11, 29 December 2023

Cerinta[edit]

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]

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]

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]

  • 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]

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

Exemplul 2[edit]

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


Rezolvare[edit]

<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]

2 divide două numere din şir.