2556 - HN
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
<syntaxhighlight lang="python" line>
- 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()
</syntaxhighlight>