1915 - Numar Minim 1: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 18 versiuni intermediare efectuate de același utilizator)
Linia 1: Linia 1:
Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp]
Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp]
== Cerinţa ==
== Cerinţa ==
Se dă numărul natural nenul '''n'''. Să se determine produsul primelor '''n''' pătrate perfecte nenule.
Georgiana nu are clipă de răgaz. Profesorul de info îi cere acum să afle cel mai mic număr natural de '''n''' cifre care împărţit la b dă restul '''rest'''. Poate o ajutaţi să treacă şi peste acest hop.
 
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură numărul '''n'''.
Programul citește de la tastatură numerele''' n, b şi rest'''.
 
== Date de ieșire ==  
== Date de ieșire ==  
Programul va afișa pe ecran, mesajul "Datele introduse corespund cerințelor" și pe o linie nouă numărul '''P''' , reprezentând produsul primelor '''n''' pătrate perfecte nenule, în caz contrar programul va afișa pe o linie noua mesajul "Datele introduse nu corespund cerintelor."
Programul va afișa pe ecran numărul cerut.
 
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează cel mai mic număr natural de n cifre care împărţit la b dă restul '''rest'''.
 
În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."


== Restricţii şi precizări ==
== Restricţii şi precizări ==
1 ≤ '''n''' ≤ 100.000
1 ≤ '''n''' ≤ 100.000
2 ≤ '''b''' ≤ 1.000.000.000
2 ≤ '''b''' ≤ 1.000.000.000
0 ≤ '''r''' < b
 
0 ≤ '''rest''' < b
 
dacă numărul nu există se va afişa -1
dacă numărul nu există se va afişa -1


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Datele de intrare
: 5 97 14
: Introduceți numărul de cifre:
; Ieșire
: 5  
: 10005
:Introduceți divizorul:
: 97  
:Introduceți restul:
: 14
; Datele de ieșire
: Datele sunt introduse corect.
: Cel mai mic număr de 5 cifre care împărțit la 97 dă restul 14 este 10005
<br>
<br>


Linia 29: Linia 44:
     return numar + 10**(n - len(str(numar))) if numar + 1 >= 10**(n - 1) else 10**(n - 1)
     return numar + 10**(n - len(str(numar))) if numar + 1 >= 10**(n - 1) else 10**(n - 1)


def find_number(n, b, r):
def find_number(n, b, rest):
     """
     """
     Găsește cel mai mic număr natural de n cifre care împărțit la b dă restul r.
     Găsește cel mai mic număr natural de n cifre care împărțit la b dă restul rest.
     """
     """
     numar = 0
     numar = 0
     while True:
     while True:
         numar = get_next_number(numar, n)
         numar = get_next_number(numar, n)
         if numar % b == r:
        if numar > 10**n - 1:
            return -1
         if numar % b == rest:
             return numar
             return numar


def main():
def validate_input(n, b, rest):
    """
    Verifică dacă valorile introduse pentru n, b și rest respectă restricțiile impuse.
    """
    if n <= 0 or n > 100000 or b < 2 or b > 1000000000 or rest < 0 or rest >= b:
        print("Datele nu corespund restricțiilor impuse.")
        return False
    print("Datele sunt introduse corect.")
    return True
 
 
if __name__ == '__main__':
     """
     """
     Funcția principală care citește numerele de la tastatură și afișează numărul cerut.
     Funcția principală care citește numerele de la tastatură și afișează numărul cerut.
Linia 45: Linia 73:
     n = int(input("Introduceți numărul de cifre: "))
     n = int(input("Introduceți numărul de cifre: "))
     b = int(input("Introduceți divizorul: "))
     b = int(input("Introduceți divizorul: "))
     r = int(input("Introduceți restul: "))
     rest = int(input("Introduceți restul: "))
     numar_cautat = find_number(n, b, r)
 
     print("Cel mai mic număr de", n, "cifre care împărțit la", b, "dă restul", r, "este", numar_cautat)
    if not validate_input(n, b, rest):
        exit()
 
     numar_cautat = find_number(n, b, rest)
     print("Cel mai mic număr de", n, "cifre care împărțit la", b, "dă restul", rest, "este", numar_cautat)


# Apelăm funcția principală
main()


</syntaxhighlight>
</syntaxhighlight>
Linia 58: Linia 88:
Funcția get_next_number(numar, n) primește un număr natural numar și numărul de cifre n și returnează următorul număr natural de n cifre care urmează după numar. Pentru aceasta, funcția adaugă 10**(n - len(str(numar))) la numar dacă numar + 1 este mai mare sau egal cu 10**(n - 1) (adică numărul numar + 1 are cel puțin n cifre), altfel returnează 10**(n - 1).
Funcția get_next_number(numar, n) primește un număr natural numar și numărul de cifre n și returnează următorul număr natural de n cifre care urmează după numar. Pentru aceasta, funcția adaugă 10**(n - len(str(numar))) la numar dacă numar + 1 este mai mare sau egal cu 10**(n - 1) (adică numărul numar + 1 are cel puțin n cifre), altfel returnează 10**(n - 1).


Funcția find_number(n, b, r) primește numărul de cifre n, divizorul b și restul r și returnează cel mai mic număr natural de n cifre care împărțit la b dă restul r. Funcția caută numărul începând de la 0, apelând funcția get_next_number() și verificând dacă numărul respectiv împărțit la b dă restul r. Dacă da, atunci funcția returnează numărul găsit.
Funcția find_number(n, b, rest) primește numărul de cifre n, divizorul b și restul rest și returnează cel mai mic număr natural de n cifre care împărțit la b dă restul rest. Funcția caută numărul începând de la 0, apelând funcția get_next_number() și verificând dacă numărul respectiv împărțit la b dă restul rest. Dacă da, atunci funcția returnează numărul găsit.


Funcția principală main() citește numerele de la tastatură și afișează numărul cerut apelând funcția find_number().
Funcția principală main() citește numerele de la tastatură și afișează numărul cerut apelând funcția find_number().


Astfel, programul determină cel mai mic număr natural de n cifre care împărțit la b dă restul r folosind cele trei funcții descrise mai sus.
Astfel, programul determină cel mai mic număr natural de n cifre care împărțit la b dă restul rest folosind cele trei funcții descrise mai sus.

Versiunea curentă din 29 aprilie 2023 20:08

Sursa: [1]

Cerinţa

Georgiana nu are clipă de răgaz. Profesorul de info îi cere acum să afle cel mai mic număr natural de n cifre care împărţit la b dă restul rest. Poate o ajutaţi să treacă şi peste acest hop.

Date de intrare

Programul citește de la tastatură numerele n, b şi rest.

Date de ieșire

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

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează cel mai mic număr natural de n cifre care împărţit la b dă restul rest.

În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."

Restricţii şi precizări

1 ≤ n ≤ 100.000

2 ≤ b ≤ 1.000.000.000

0 ≤ rest < b

dacă numărul nu există se va afişa -1

Exemplul 1

Datele de intrare
Introduceți numărul de cifre:
5
Introduceți divizorul:
97
Introduceți restul:
14
Datele de ieșire
Datele sunt introduse corect.
Cel mai mic număr de 5 cifre care împărțit la 97 dă restul 14 este 10005


Rezolvare

#1915
def get_next_number(numar, n):
    """
    Returnează următorul număr natural de n cifre care urmează după numar.
    """
    return numar + 10**(n - len(str(numar))) if numar + 1 >= 10**(n - 1) else 10**(n - 1)

def find_number(n, b, rest):
    """
    Găsește cel mai mic număr natural de n cifre care împărțit la b dă restul rest.
    """
    numar = 0
    while True:
        numar = get_next_number(numar, n)
        if numar > 10**n - 1:
            return -1
        if numar % b == rest:
            return numar

def validate_input(n, b, rest):
    """
    Verifică dacă valorile introduse pentru n, b și rest respectă restricțiile impuse.
    """
    if n <= 0 or n > 100000 or b < 2 or b > 1000000000 or rest < 0 or rest >= b:
        print("Datele nu corespund restricțiilor impuse.")
        return False
    print("Datele sunt introduse corect.")
    return True


if __name__ == '__main__':
    """
    Funcția principală care citește numerele de la tastatură și afișează numărul cerut.
    """
    n = int(input("Introduceți numărul de cifre: "))
    b = int(input("Introduceți divizorul: "))
    rest = int(input("Introduceți restul: "))

    if not validate_input(n, b, rest):
        exit()

    numar_cautat = find_number(n, b, rest)
    print("Cel mai mic număr de", n, "cifre care împărțit la", b, "dă restul", rest, "este", numar_cautat)

Explicatie cod: Acest cod conține 3 funcții și o funcție principală:

Funcția get_next_number(numar, n) primește un număr natural numar și numărul de cifre n și returnează următorul număr natural de n cifre care urmează după numar. Pentru aceasta, funcția adaugă 10**(n - len(str(numar))) la numar dacă numar + 1 este mai mare sau egal cu 10**(n - 1) (adică numărul numar + 1 are cel puțin n cifre), altfel returnează 10**(n - 1).

Funcția find_number(n, b, rest) primește numărul de cifre n, divizorul b și restul rest și returnează cel mai mic număr natural de n cifre care împărțit la b dă restul rest. Funcția caută numărul începând de la 0, apelând funcția get_next_number() și verificând dacă numărul respectiv împărțit la b dă restul rest. Dacă da, atunci funcția returnează numărul găsit.

Funcția principală main() citește numerele de la tastatură și afișează numărul cerut apelând funcția find_number().

Astfel, programul determină cel mai mic număr natural de n cifre care împărțit la b dă restul rest folosind cele trei funcții descrise mai sus.