1910 - Numar Minim 0: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 21 de 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 ==
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 ==
Linia 7: Linia 7:


== 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, pe '''linii separate''', cele '''n''' numere cerute.


Dacă datele sunt introduse corect, programul va rula.


În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: ''' "Datele nu corespund restricțiilor impuse.".'''
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 ==
== Restricţii şi precizări ==
* 0 < '''n''' ⩽ 10
1 ≤ '''n''' 10
 
1 ≤ '''primul_nr''' ≤ 100.000
 
2 ≤ '''al_doilea_nr''' ≤ 10
 
0 ≤ '''rest''' < b


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Datele de intrare
: 4
: Introduceti numarul de triplete:
; Ieșire
: 3
: Datele corespund cerințelor.
: Introduceti tripletul 1 de forma m_cifre n_cifre rest:
: 576
: 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
<br>
<br>


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#4273
#1910
def patrate_perfecte(n):
def gaseste_numar(m_cifre, n_cifre, rest):
     patrate = []
     for j in range(10**(m_cifre-1), 10**m_cifre):
    i = 1
         if j % n_cifre == rest:
    while len(patrate) < n:
            return j
         patrat = i * i
        patrate.append(patrat)
        i += 1
    return patrate


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


def calculeaza(numbers):
if __name__ == '__main__':
     product = 1
     n = int(input("Introduceti numarul de triplete: "))
     for number in numbers:
     for i in range(n):
         product *= number
         m_cifre, n_cifre, rest = map(int, input("Introduceti tripletul {} de forma m_cifre n_cifre rest: ".format(i+1)).split())
    return product
        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>


def validare_numar(n):
'''Explicatie cod:'''
    if n < 1 or n > 10:
        return False
    return True


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.


if __name__ == '__main__':
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.  
    n = int(input("Introduceți numărul n: "))
    if not validare_numar(n):
        print("Datele introduse nu corespund cerintelor.")
    else:
        squares = patrate_perfecte(n)
        product = calculeaza(squares)
        print("Datele introduse corespund cerintelor.")
        print(product)


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.


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

Versiunea curentă din 29 aprilie 2023 20:00

Sursa: [1]

Cerinţa

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

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

Date de ieșire

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

1 ≤ n ≤ 10

1 ≤ primul_nr ≤ 100.000

2 ≤ al_doilea_nr ≤ 10

0 ≤ rest < b

Exemplul 1

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

#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))

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