Trójkąt pascala Spoj

0

Witam mam problem z akceptacja("Błędna odpowiedź") zadania na SPOJ-u polegającego na podaniu n-tego wiersza trójkąta i wypisaniu go.
link do zadania: https://pl.spoj.com/problems/TROJPASC/
Mój kod do zadania to:

def factorial(n):
    if n < 2 :
        return 1
    else:
        return n * factorial(n - 1)

def pascals_triangle(n):
    tab = []
    if n < 0 or n > 100:
        return None
    if n < 1:
        tab.append(1)
    else:
        for i in range(n + 1):
            if i == 0 or i == n:
                tab.append(1)
            else:
                a = int(factorial(n)/(factorial(i) * factorial(n - i)))
                tab.append(a)
    for k in range(len(tab)):
        print(tab[k], end= " ")
    print()

t = int(input())

for i in range(t):
    n = int(input())
    pascals_triangle(n)

Jak widać poszczególne liczby trójkąta("a") licze poprzez kombinacje tj. n!/k! * (n-k)!,
Proszę o jakies sugestie :)

2

Popatrz tutaj: http://discuss.spoj.com/t/5927-trojkat-pascala-trojpasc/9145
Twoja największa liczba różni się od tej podawanej na forum przez autora zadań, do tego zauważ że nawiększa liczba wynosi 100891344545564193334812497256, to dużo nawet jak dla komputerów. Do tego ty dzielisz, liczby w rzeczywiste w komputerze są tylko przybliżeniem, sprawdź sobie wynik np. takiego warunku (0.1 + 0.2 == 0.3), więc zwykłe dzielenie będzie powodować błędy. Muisz w jakiś sposób to obejść :)

0

Dzięki :) przy a = int(factorial(n)/(factorial(i) * factorial(n - i))) użyłem "//" dzielenia z wynikiem całkowitym wtedy miałem tą największą liczbę dla n = 100 taką samą jaką autor zadania podał, sędzia zaakceptował

0
t=int(input())
for _ in range(t):
  n=int(input())
  ans=[1]
  for i in range(1,n+1):
    ans.append(ans[-1]*(n-i+1)//i)
  print(*ans)

1 użytkowników online, w tym zalogowanych: 0, gości: 1