3 / 3
May 2020

Cześć wszystkim.
Mam pewien problem z zadaniem NWW27. Zależy mi na tym żeby wykonać je w Pythonie bo uczę się teraz tego języka. A więc w Pythonie, w odróżnieniu od C, liczby nie mają teoretycznie żadnego limitu. Natomiast w moim programie działania na dużych liczbach tworzą dziwne anomalie.
Oto mój kod:

import math


def nww(a, b):
    return (a * b) / math.gcd(a, b)


global temp
number_of_cases = int(input())
for x in range(number_of_cases):
    number_of_numbers = int(input())
    line = input()
    numbers = list(line.split())
    if number_of_numbers == 1:
        print(numbers[0])
    else:
        for y in range(1, number_of_numbers):
            temp = nww(int(numbers[y - 1]), int(numbers[y]))
            numbers[y] = temp
        print(int(temp))

Gdy dane są stosunkowo małe, program działa poprawnie. Jeżeli jednak działać będziemy na nieco większych liczbach to zaczynają się kłopoty. Przykładowo test:

1
2
18446744073709551615 18446744073709551615

Daje taki wynik:
18446744073709551616

(czyli liczbę o 1 większą niż powinien)

Pytanie kieruje przede wszystkim do osób biegłych w tym pięknym języku. Co tu właściwie zachodzi?

  • created

    May '20
  • last reply

    May '20
  • 2

    replies

  • 527

    views

  • 2

    users

  • 2

    likes

  • 1

    link

Biegly w python nie jestem.

Liczby calkowite nie maja teoretycznie limitu, ale liczby zmiennoprzecinkowe juz maja (okolo 17 miejsc dziesietnych znaczacych). Przy operatorze “/” nastepuje automatyczna konwersja.
Jest tez operator dzielenia liczb calkowitych “//”, ktory powinien zalatwic sprawe.