Pythonowiec vs prosta funkcja C

0

Siema ludzia.Ostatnio postanowiłem nauczyć się czystego C (++ póki co mnie nie interesuje), niby co może sie nie udać przecież to musi być choć trochę podobne do pythona! No więc przeczytałem pół jakiejś książki, okazało się że traktuje o poprzedniej wersji czyli bodajże 99, odrzuciłem tą lekture i znazałem już aktualniejszą(CNotesForProfessionals), jednak mętlik w głowie jedynie rośnie, i mam taką małą prośbę by ktoś z was powiedział mi jak w 100% poprawnie w praktyce przełożyć taki prosty kod pythona na C:

def odd_count(n):
    s = [x for x in range(n) if x % 2]
    return len(s)

Haczyk polega na tym że nawet w pythonie ten kod potrafi się 'wysypać' jak dostanie za duże n(Python2=MemoryError), lub wykonywać bardzo długo(Python3), jak byście to ugryźli w C?

Pozdrawiam!

12

Wliczając n (czyli odd_count(3) == 2)

uint64_t odd_count(uint64_t n)
{
    return n / 2 + n % 2;
}

Lub na bitach:

uint64_t odd_count(uint64_t n)
{
    return (n >> 1) + (n & 1);
}

Bez wliczania n (czyli odd_count(3) == 1)

uint64_t odd_count(uint64_t n)
{
    return n / 2;
}

Lub na bitach:

uint64_t odd_count(uint64_t n)
{
    return n >> 1;
}

Nie ma potrzeby bawić się w jakieś listy, w Pythonie też.

2

Niestety Clang3.6-C11 wyrzuca mi błąd "unknown type name 'uint64_t'", natomiast działa bezproblemowo w C++.

C do obsługi typu uint64_t wymaga dołączenia pliku nagłówkowego stdint.h

Jednak w tej funkcji chodzi o to aby z liczby N wyliczyła ilość nieparzystych liczb całkowitych w zakresie N, natomiast "n / 2 + n % 2" (oraz wersja z +1) jest zawsze o 1 w paru testach źle

Pytanko - zakres ma być <0,N> czy <1,n>?
Rozpatrzmy prosty przykład - od 0 do 5 włącznie:
0,1,2,3,4,5 - sześc liczb, na pół wyjdzie 3
od 1 do 5:
1,2,3,4,5 - pięć liczb, na pół wyjdzie 2

0

Kurde jesteście świetni, a ja głupi jak but.Rozwiązanie było tak proste że aż mi wstyd, "%2" i żadne listy faktycznie niepotrzebne, po prostu jeden test miał błąd i tego nie zauważyłem więc szukałem na około i robiłem jakieś durne listy, a wystarczyło return n/2 -.-.
Dzięki!

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