• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z PTwPZ Klub Kibica ze spoja (Python)

Object Storage Arubacloud
0 głosów
141 wizyt
pytanie zadane 29 czerwca 2020 w Python przez krzysieq18 Nowicjusz (230 p.)

Sędzia pokazuje błędną odpowiedź, W zadaniu wykorzystuję Trójkąt Pascala. Proszę o pomoc.

Zadanie: https://pl.spoj.com/problems/PTWPZ076/

Kod: https://pastebin.com/AJsvHAsm

def Factorial(var):
  fac = 1
 
  for i in range(2, var + 1, 1):
    fac *= i
 
  return fac
 
 
def Binomial_theorem(n, k):
  comb = Factorial(n) / ((Factorial(k)) * (Factorial(n - k)))
  return comb
 
tests = int(input())
 
while tests:
  fans, places = [int(fans) for fans in input().split()]
 
  ip = Binomial_theorem(fans, places)
  print(int(ip))
 
  tests -= 1

 

1 odpowiedź

0 głosów
odpowiedź 29 czerwca 2020 przez adrian17 Ekspert (345,160 p.)
wybrane 29 czerwca 2020 przez krzysieq18
 
Najlepsza

Musiałem porównać z poprawnymi wynikami, żeby zauważyć :) Bo to dość subtelny błąd.

comb = Factorial(n) / ((Factorial(k)) * (Factorial(n - k)))

`/` to w Pythonie dzielenie liczb rzeczywistych. To znaczy np '3/4' dałoby 0.75 (co oczywiście u Ciebie się zdarzyć nie może, ale nie zmienia faktu jak działa dzielenie). Ale dzielenie liczb rzeczywistych daje w wyniku liczby zmiennoprzecinkowe - a one mają ograniczoną precyzję. Tak więc:

a = 126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000
b = 69237837345426015193166198943959583654468513190741907865600000000000000
>>> comb = a / b
>>> comb
1.8326241409425905e+18
>>> int(comb)
1832624140942590464

Ale gdy użyjesz dzielenia liczb całkowitych, tego problemu nie ma, bo nie przechodzisz po drodze przez liczby zmiennoprzecinkowe:

>>> comb = a // b
>>> comb
1832624140942590534

 

komentarz 29 czerwca 2020 przez adrian17 Ekspert (345,160 p.)

A swoją drogą, drobne uwagi:

for i in range(2, var + 1, 1):

ostatni argument jest tu niepotrzebny, bo jest domyślnie 1

while tests:
  (...)
  tests -= 1

Można zamienić na zwykłe

for i in range(tests):

A, no i funkcje w Pythonie zazwyczaj zaczynamy małą literą.

komentarz 29 czerwca 2020 przez krzysieq18 Nowicjusz (230 p.)
Przeszło! Dzięki wielkie :D

Podobne pytania

0 głosów
2 odpowiedzi 284 wizyt
pytanie zadane 12 marca 2023 w SPOJ przez skyynet Początkujący (410 p.)
0 głosów
0 odpowiedzi 128 wizyt
pytanie zadane 6 września 2020 w SPOJ przez magda_19 Gaduła (3,080 p.)
0 głosów
2 odpowiedzi 464 wizyt

92,632 zapytań

141,500 odpowiedzi

319,879 komentarzy

62,012 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...