2556 - HN
De la Universitas MediaWiki
Enunţ
Fie N un număr natural și expresia HN=1+1/2+1/3+…+1/N.
Cerința
Determinați numerele naturale P și Q ce reprezintă numărătorul respectiv numitorul fracției ireductibile HN=P/Q.
Date de intrare
Fișierul de intrare hn.in conţine pe prima linie numărul natural N.
Date de ieșire
Fișierul de ieșire hn.out va conţine pe prima linie numărul P și pe a doua linie numărul Q.
Restricții și precizări
- 2 ≤ N ≤ 10000
Exemplul 1
- hn.in
- 6
- hn.out
- 49
- 20
Exemplul 2
- hn.in
- 20
- hn.out
- 55835135
- 15519504
Exemplul 3
- hn.in
- -10
- hn.out
- Date de intrare invalide!
Rezolvare
#2556 hn
def gcd(a, b):
while b:
a, b = b, a % b
return a
def simplify_fraction(num, denom):
divisor = gcd(num, denom)
return num // divisor, denom // divisor
def calculate_harmonic_fraction(N):
numerator = 0
denominator = 1
for i in range(1, N + 1):
numerator = numerator * i + denominator
denominator *= i
return numerator, denominator
def validate_input(N):
if not (isinstance(N, int) and 2 <= N <= 10000):
with open('hn.out', 'w') as f:
f.write("Date de intrare invalide!")
return False
return True
def main():
try:
# Citirea datelor din fișierul de intrare
with open('hn.in', 'r') as f:
N = int(f.readline().strip())
except FileNotFoundError:
with open('hn.out', 'w') as f:
f.write("Fisierul de intrare nu a fost gasit.")
return
except ValueError:
with open('hn.out', 'w') as f:
f.write("Date de intrare invalide!")
return
# Validarea datelor de intrare
if not validate_input(N):
return
# Calcularea fractiei armonice si simplificarea ei
numerator, denominator = calculate_harmonic_fraction(N)
numerator, denominator = simplify_fraction(numerator, denominator)
# Scrierea rezultatului in fisierul de iesire
with open('hn.out', 'w') as f:
f.write(str(numerator) + '\n')
f.write(str(denominator))
if __name__ == "__main__":
main()