1910 - Numar Minim 0: Difference between revisions

From Bitnami MediaWiki
Sinn Erich (talk | contribs)
Sinn Erich (talk | contribs)
 
(14 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 a mai primit o problemă de la doamna profesor. Se dau '''n''' triplete de forma '''m, b, r,''' iar pentru fiecare triplet Georgiana trebuie să afle care este cel mai mic număr natural format cu '''m''' cifre, care împărţit la '''b''' dă restul '''r'''.
Georgiana a mai primit o problemă de la doamna profesor. Se dau '''n''' triplete de forma '''primul_nr, al_doilea_nr, rest,''' iar pentru fiecare triplet Georgiana trebuie să afle care este cel mai mic număr natural format cu '''primul_nr''' , care împărţit la '''al_doilea_nr''' dă restul '''rest'''.


== Date de intrare ==
== Date de intrare ==
Line 10: Line 10:




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


În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."
În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."
Line 17: Line 17:
1 ≤ '''n''' ≤ 10
1 ≤ '''n''' ≤ 10


1 ≤ '''m''' ≤ 100.000
1 ≤ '''primul_nr''' ≤ 100.000


2 ≤ '''b''' ≤ 10
2 ≤ '''al_doilea_nr''' ≤ 10


0 ≤ '''r''' < b
0 ≤ '''rest''' < b


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Datele de intrare
: Introduceti numarul de triplete:
: 3
: 3
: Introduceti tripletul 1 de forma m_cifre n_cifre rest:
: 2 3 1
: 2 3 1
:Introduceti tripletul 2 de forma m_cifre n_cifre rest:
: 3 5 4
: 3 5 4
:Introduceti tripletul 3 de forma m_cifre n_cifre rest:
: 4 6 0
: 4 6 0
; Ieșire
; Datele de ieșire
: Datele sunt introduse corect.
: 10
: 10
: 104
: 104
Line 38: Line 43:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#1910
#1910
def gaseste_numar(m, b, r):
def gaseste_numar(m_cifre, n_cifre, rest):
     for j in range(10**(m-1), 10**m):
     for j in range(10**(m_cifre-1), 10**m_cifre):
         if j % b == r:
         if j % n_cifre == rest:
             return j
             return j


def validate_input(m, b, r):
def validate_input(m_cifre, n_cifre, rest):
     if not (1 <= m <= 100000) or not (2 <= b <= 10) or not (0 <= r < b):
     if not (1 <= m_cifre <= 100000) or not (2 <= n_cifre <= 10) or not (0 <= rest < n_cifre):
         return False
         return False
     return True
     return True
Line 51: Line 56:
     n = int(input("Introduceti numarul de triplete: "))
     n = int(input("Introduceti numarul de triplete: "))
     for i in range(n):
     for i in range(n):
         m, b, r = map(int, input("Introduceti tripletul {} de forma m b r: ".format(i+1)).split())
         m_cifre, n_cifre, rest = map(int, input("Introduceti tripletul {} de forma m_cifre n_cifre rest: ".format(i+1)).split())
         if not validate_input(m, b, r):
         if not validate_input(m_cifre, n_cifre, rest):
             print("Datele nu corespund restricțiilor impuse.")
             print("Datele nu corespund restricțiilor impuse.")
         else:
         else:
             print("Datele sunt introduse corect.")
             print("Datele sunt introduse corect.")
             print(gaseste_numar(m, b, r))
             print(gaseste_numar(m_cifre, n_cifre, rest))


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 20:00, 29 April 2023

Sursa: [1]

Cerinţa[edit | edit source]

Georgiana a mai primit o problemă de la doamna profesor. Se dau n triplete de forma primul_nr, al_doilea_nr, rest, iar pentru fiecare triplet Georgiana trebuie să afle care este cel mai mic număr natural format cu primul_nr , care împărţit la al_doilea_nr dă restul rest.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n triplete de numere naturale.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran, pe linii separate, cele n numere cerute.


Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează care este cel mai mic număr natural format cu n_cifre , care împărţit la m_cifre 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 ≤ 10

1 ≤ primul_nr ≤ 100.000

2 ≤ al_doilea_nr ≤ 10

0 ≤ rest < b

Exemplul 1[edit | edit source]

Datele de intrare
Introduceti numarul de triplete:
3
Introduceti tripletul 1 de forma m_cifre n_cifre rest:
2 3 1
Introduceti tripletul 2 de forma m_cifre n_cifre rest:
3 5 4
Introduceti tripletul 3 de forma m_cifre n_cifre rest:
4 6 0
Datele de ieșire
Datele sunt introduse corect.
10
104
1002


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1910

def gaseste_numar(m_cifre, n_cifre, rest):

   for j in range(10**(m_cifre-1), 10**m_cifre):
       if j % n_cifre == rest:
           return j

def validate_input(m_cifre, n_cifre, rest):

   if not (1 <= m_cifre <= 100000) or not (2 <= n_cifre <= 10) or not (0 <= rest < n_cifre):
       return False
   return True

if __name__ == '__main__':

   n = int(input("Introduceti numarul de triplete: "))
   for i in range(n):
       m_cifre, n_cifre, rest = map(int, input("Introduceti tripletul {} de forma m_cifre n_cifre rest: ".format(i+1)).split())
       if not validate_input(m_cifre, n_cifre, rest):
           print("Datele nu corespund restricțiilor impuse.")
       else:
           print("Datele sunt introduse corect.")
           print(gaseste_numar(m_cifre, n_cifre, rest))

</syntaxhighlight>

Explicatie cod:

Acest program primește de la utilizator un număr n, care reprezintă numărul de triplete de forma m, b, r ce urmează să fie introduse.

Apoi, într-un for loop, pentru fiecare triplet introdus, este apelată funcția de validare validate_input care verifică dacă m respectă restricțiile de la 1 la 100000, b respectă restricțiile de la 2 la 10 și r respectă restricția de la 0 la b-1. Dacă tripletul introdus nu respectă aceste restricții, se afișează un mesaj de eroare.

Dacă tripletul este valid, atunci este apelată funcția gaseste_numar, care găsește cel mai mic număr natural cu m cifre, care împărțit la b dă restul r și îl afișează pe ecran.

Funcția gaseste_numar lucrează în felul următor: pentru fiecare număr j din intervalul [10**(m-1), 10**m), verifică dacă j împărțit la b dă restul r. Dacă da, atunci acesta este cel mai mic număr cu m cifre care împărțit la b dă restul r și îl returnează. Dacă nu, continuă cu următorul număr până găsește unul care să satisfacă condiția dată.