2371 - Biliard
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 numar1 și numar2 reprezentând lungimea respectiv lățimea mesei..
Date de ieşire
Programul va afișa pe ecran numărul cerut.
Restricții și precizări
- 1 ⩽ numar1 ⩽ numar2 ⩽ 10.000
Exemplu
- Intrare
- 8 3
- Ieșire
- Datele introduse corespund restricțiilor impuse.
- 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
<syntaxhighlight lang="python" line> def validare_date(numar1, numar2):
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: return True return False
def gcd(numar1, numar2):
if numar2 == 0: return numar1 return gcd(numar2, numar1 % numar2)
if __name__ == '__main__':
numar1, numar2 = map(int, input().split()) n, m = numar1, numar2 if validare_date(numar1, numar2): gcd_value = gcd(numar1, numar2) lcm_value = (n//gcd_value) * m print("\nDatele de intrare corespund restricțiilor impuse.\n") print(lcm_value//numar1 + lcm_value//numar2 - 2) else: print("Datele de intrare nu corespund restricțiilor impuse.")
</syntaxhighlight>