1910 - Numar Minim 0: Difference between revisions

From Bitnami MediaWiki
Sinn Erich (talk | contribs)
Sinn Erich (talk | contribs)
 
(6 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 '''n_cifre, m_cifre, rest,''' iar pentru fiecare triplet Georgiana trebuie să afle care este cel mai mic număr natural format cu '''n_cifre''' cifre, care împărţit la '''m_cifre''' dă restul '''rest'''.
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 17: Line 17:
1 ≤ '''n''' ≤ 10
1 ≤ '''n''' ≤ 10


1 ≤ '''n_cifre''' ≤ 100.000
1 ≤ '''primul_nr''' ≤ 100.000


2 ≤ '''m_cifre''' ≤ 10
2 ≤ '''al_doilea_nr''' ≤ 10


0 ≤ '''rest''' < b
0 ≤ '''rest''' < b
Line 27: Line 27:
: Introduceti numarul de triplete:
: Introduceti numarul de triplete:
: 3
: 3
: Introduceti tripletul {} de forma n_cifre m_cifre rest: "
: 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
; Datele de ieșire
; Datele de ieșire
Line 41: 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 54: 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 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]

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]

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

Date de ieșire[edit]

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]

1 ≤ n ≤ 10

1 ≤ primul_nr ≤ 100.000

2 ≤ al_doilea_nr ≤ 10

0 ≤ rest < b

Exemplul 1[edit]

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]

<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ă.