3352 - Factori 1: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == Cerinţa == Se dau două numere naturale. Afișați numărul pentru care suma factorilor primi distincți este mai mare. Dacă cele două numere au aceași sumă a factorilor primi, afișați-l pe cel mai mic. == Date de intrare == Programul citește de la tastatură două numere naturale. == Date de ieşire == Programul va afișa pe ecran numărul cerut. == Restricții și precizări == *cele două numere citite vor fi mai mici decât '''1.000.000.000''' == Exemplu == ; I...)
 
Fără descriere a modificării
Linia 58: Linia 58:
</syntaxhighlight>
</syntaxhighlight>
==Explicație rezolvare==
==Explicație rezolvare==
Acest cod calculează suma exponentelor primelor divizori ai numerelor date, apoi compară aceste sume și afișează numărul cu suma mai mare sau, în caz de egalitate, numărul mai mic dintre cele două numere.
Acest program primește de la utilizator două numere întregi și verifică dacă acestea îndeplinesc anumite condiții. Dacă numerele sunt valabile, programul afișează numărul dintre cele două care are suma cifrelor factorilor primi mai mare. Dacă suma este aceeași pentru ambele numere, programul va afișa cel mai mic dintre cele două numere. Dacă cele două numere nu sunt valabile, programul afișează un mesaj de eroare.
 
Funcția prim(x) primește un număr întreg x și calculează suma exponentelor primelor divizori ai lui x. Pentru aceasta, se începe cu divizorul d = 2 și se verifică dacă d este un divizor al lui x. Dacă da, se calculează cât de multe ori d divide x, adunând numărul de divizori primi de acest tip la variabila cnt. Apoi se trece la divizorul următor, incrementându-se d. Acest lucru se repetă până când d depășește radicalul din x sau când x devine 1. În final, se returnează suma divizorilor primi ai lui x.
 
În funcția validate_input(x, y) se verifică dacă ambele numere primite sunt pozitive și diferite de zero. Dacă cel puțin una dintre aceste condiții nu este îndeplinită, se returnează False, altfel se returnează True.
 
În blocul if __name__ == '__main__':, se primesc cele două numere x și y, apoi se verifică dacă sunt valide folosind funcția validate_input(x, y). Dacă da, se afișează mesajul "Datele de intrare corespund restricțiilor impuse." și se calculează și se afișează numărul dorit conform cerinței folosind funcția prim(x). Dacă nu, se afișează mesajul "Datele de intrare nu corespund restricțiilor impuse." fără a face nicio altă acțiune.

Versiunea de la data 11 aprilie 2023 11:00

Cerinţa

Se dau două numere naturale. Afișați numărul pentru care suma factorilor primi distincți este mai mare. Dacă cele două numere au aceași sumă a factorilor primi, afișați-l pe cel mai mic.

Date de intrare

Programul citește de la tastatură două numere naturale.

Date de ieşire

Programul va afișa pe ecran numărul cerut.

Restricții și precizări

  • cele două numere citite vor fi mai mici decât 1.000.000.000

Exemplu

Intrare
36 26
Ieșire
26

Explicație

Factorii primi ai lui 36 sunt 2 și 3, cu suma 5. Factorii primi ai lui 26 sunt 2 și 13, cu suma 15. Rezultatul este 26, pentru că are suma factorilor primi mai mare.

Rezolvare

import math

def prim(x):
    d = 2
    cnt = 0
    while x > 1:
        p = 0
        while x % d == 0:
            p += 1
            x //= d
        if p:
            cnt += d
        d += 1
        if d * d > x:
            d = x
    return cnt

def validate_input(x, y):
    if x < 0 or y < 0:
        return False
    if x == 0 and y == 0:
        return False
    return True

if __name__ == '__main__':
    x, y = map(int, input().split())
    if validate_input(x, y):
        print("\nDatele de intrare corespund restricțiilor impuse.\n")
        if prim(x) > prim(y):
            print(x)
        elif prim(x) < prim(y):
            print(y)
        else:
            print(min(x, y))
    else:
        print("Datele de intrare nu corespund restricțiilor impuse.")

Explicație rezolvare

Acest program primește de la utilizator două numere întregi și verifică dacă acestea îndeplinesc anumite condiții. Dacă numerele sunt valabile, programul afișează numărul dintre cele două care are suma cifrelor factorilor primi mai mare. Dacă suma este aceeași pentru ambele numere, programul va afișa cel mai mic dintre cele două numere. Dacă cele două numere nu sunt valabile, programul afișează un mesaj de eroare.