1915 - Numar Minim 1: Difference between revisions
Sinn Erich (talk | contribs) |
Sinn Erich (talk | contribs) |
||
(18 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp] | Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp] | ||
== Cerinţa == | == 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 == | == Date de intrare == | ||
Programul citește de la tastatură | 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, | 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 ≤ ''' | |||
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 == | ||
; | ; Datele de intrare | ||
: 5 97 14 | : Introduceți numărul de cifre: | ||
; | : 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> | ||
Line 29: | Line 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, | 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 | 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 == | if numar > 10**n - 1: | ||
return -1 | |||
if numar % b == rest: | |||
return numar | return numar | ||
def | 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. | ||
Line 45: | Line 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: ")) | ||
rest = int(input("Introduceți restul: ")) | |||
numar_cautat = find_number(n, b, | |||
print("Cel mai mic număr de", n, "cifre care împărțit la", b, "dă 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) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 58: | Line 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, | 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 | 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. |
Latest revision as of 20:08, 29 April 2023
Sursa: [1]
Cerinţa[edit | edit source]
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[edit | edit source]
Programul citește de la tastatură numerele n, b şi rest.
Date de ieșire[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 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[edit | edit source]
<syntaxhighlight lang="python" line>
- 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)
</syntaxhighlight>
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.