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