2371 - Biliard: Diferență între versiuni

De la Universitas MediaWiki
Fără descriere a modificării
 
Linia 4: Linia 4:
Scrieți un program care calculează de câte ori ('''nrSchimb''') mingea își schimbă direcția de mers până când se oprește într-un colț. Punctul de pornire nu se numără.
Scrieți un program care calculează de câte ori ('''nrSchimb''') mingea își schimbă direcția de mers până când se oprește într-un colț. Punctul de pornire nu se numără.
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură numerele '''numar1''' și '''numar2''' reprezentând lungimea respectiv lățimea mesei..
Programul citește de la tastatură numerele '''a''' și '''b''' reprezentând lungimea respectiv lățimea mesei.
== Date de ieşire ==
== 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 numărul '''nrSchimb''' reprezentând valoarea cerută.În cazul contrar,se va afișa pe ecran '''"Datele nu corespund restricțiilor impuse."'''.
 
== Restricții și precizări ==
== Restricții și precizări ==
* 1 ⩽ numar1 ⩽ numar2 ⩽ 10.000
* 1 ⩽ a ⩽ b ⩽ 10.000
== Exemplu ==
== Exemplu ==
; Intrare
; Intrare
: 8 3
: 8 3
; Ieșire
; Ieșire
: Datele introduse corespund restricțiilor impuse.
: Datele sunt introduse corect.
: 9
: 9
== Explicație ==  
== Explicație ==  
Linia 20: Linia 19:
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validare_date(numar1, numar2):
#Verificăm dacă datele introduse corespund restricțiilor impuse
     if 1 <= numar1 <= 10000 and 1 <= numar2 <= 10000 and 1 <= min(numar1, numar2) <= max(numar1, numar2) <= 10000 and (max(numar1, numar2) - min(numar1, numar2)) <= 1000:
def validare_date(a, b):
     if 1 <= a <= 10000 and 1 <= b <= 10000 and 1 <= min(a, b) <= max(a, b) <= 10000 and (max(a, b) - min(a, b)) <= 1000:
         return True
         return True
     return False
     return False


def gcd(numar1, numar2):
#Calculăm cel mai mare divizor comun dintre două numere.
     if numar2 == 0:
def cmmdc(a, b):
         return numar1
 
     return gcd(numar2, numar1 % numar2)
     if b == 0:
         return a
     return cmmdc(b, a % b)


if __name__ == '__main__':
if __name__ == '__main__':
     numar1, numar2 = map(int, input().split())
     lungime, lățime = map(int, input().split())
     n, m = numar1, numar2
     n, m = lungime, lățime
     if validare_date(numar1, numar2):
     if validare_date(lungime, lățime):#Dacă datele introduse sunt corecte
      gcd_value = gcd(numar1, numar2)
        divizor_comun =cmmdc(lungime, lățime)
      lcm_value = (n//gcd_value) * m
        # Calculăm cel mai mic multiplu comun al numerelor "lungime" și "lățime"
      print("\nDatele de intrare corespund restricțiilor impuse.\n")
        cmmmc = (n // divizor_comun) * m
      print(lcm_value//numar1 + lcm_value//numar2 - 2)
        print("\nDatele sunt introduse corect.\n")
        print(cmmmc // lungime + cmmmc // lățime - 2)
     else:
     else:
         print("Datele de intrare nu corespund restricțiilor impuse.")
         print("Datele nu corespund restricțiilor impuse.")
</syntaxhighlight>
</syntaxhighlight>

Versiunea curentă din 11 aprilie 2023 15:44

Cerinţa

Avem la dispoziție o masa de biliard dreptunghiulara. O bila pornește din colțul stânga jos al dreptunghiului sub un unghi de 45 grade față de latura de jos a dreptunghiului și lovește latura de sus sau latura din dreapta. Aici ricoșează (pornește spre o altă latură tot sub un unghi de 45 grade față de latura de care s-a lovit). Își continuă drumul până când ajunge într-un colț al dreptunghiului.

Scrieți un program care calculează de câte ori (nrSchimb) mingea își schimbă direcția de mers până când se oprește într-un colț. Punctul de pornire nu se numără.

Date de intrare

Programul citește de la tastatură numerele a și b reprezentând lungimea respectiv lățimea mesei.

Date de ieşire

Dacă datele sunt introduse corect,pe ecran se va afișa :"Datele sunt introduse corect.",apoi pe un rând nou numărul nrSchimb reprezentând valoarea cerută.În cazul contrar,se va afișa pe ecran "Datele nu corespund restricțiilor impuse.".

Restricții și precizări

  • 1 ⩽ a ⩽ b ⩽ 10.000

Exemplu

Intrare
8 3
Ieșire
Datele sunt introduse corect.
9

Explicație

De 4 ori lovește latura de sus, o dată latura din stânga și din dreapta și de 3 ori latura de jos și intră în colțul dreapta-jos.

Rezolvare

#Verificăm dacă datele introduse corespund restricțiilor impuse
def validare_date(a, b):
    if 1 <= a <= 10000 and 1 <= b <= 10000 and 1 <= min(a, b) <= max(a, b) <= 10000 and (max(a, b) - min(a, b)) <= 1000:
        return True
    return False

#Calculăm cel mai mare divizor comun dintre două numere.
def cmmdc(a, b):

    if b == 0:
        return a
    return cmmdc(b, a % b)

if __name__ == '__main__':
    lungime, lățime = map(int, input().split())
    n, m = lungime, lățime
    if validare_date(lungime, lățime):#Dacă datele introduse sunt corecte
        divizor_comun =cmmdc(lungime, lățime)
        # Calculăm cel mai mic multiplu comun al numerelor "lungime" și "lățime"
        cmmmc = (n // divizor_comun) * m
        print("\nDatele sunt introduse corect.\n")
        print(cmmmc // lungime + cmmmc // lățime - 2)
    else:
        print("Datele nu corespund restricțiilor impuse.")