algorytm funkcji modulo

LE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Mam problem z zapisaniem czegoś takiego:
if(x%2==0)
//wykonaj instrukcje

ale bez używania funkcji modulo. Ma ktoś jakiś pomysł?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
3

Zakładając, że x jest liczbą nieujemną (unsigned int), x % 2 == 0 można zastąpić x & 1 == 0 (gdzie & oznacza binarne and).

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
3

Dla dowlnego podzielnika: jak jak w matematyce.
Podzielić to bez ułamków, wymnożyć, i wynik mnożenia odjąć od początkowej liczby

99xmarcin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2420
1

Jako ciekawostka (nie jest to najlepszy pomysł) można wykorzystać zachowanie się dzielenia liczb w C/C++/Java/C# a więc to że (3 / 2 == 1):
((x / 2) * 2) == x.

Zastępując operacje dzielenia przez >> i << można też:

Kopiuj
((x >> 1) << 1) == x

Na koniec pomysł zupełnie szalony: Math.pow(-1, x) > 0.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

Algorytm reszty z dzielenia to poziom szkoły podstawowej:

a%b -> Odejmuj b od liczby a dopóki wynik jest większy lub równy b.

Kopiuj
def modulo(a,b):
    remainder = a
    while remainder >= b:
        remainder = remainder-b
    return remainder

W przypadku dzielenia przez 2 wystarczy oczywiście sprawdzać tylko ostatni bit, bo on określa czy liczba jest parzysta czy nieparzysta.

LE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

tylko jak ten rozpisany mod zapisać jako warunek if bez tworzenia nowej funkcji? (to pseudokod, więc nie mogę za bardzo szaleć)

stivens
  • Rejestracja: dni
  • Ostatnio: dni
0

to pseudokod, więc nie mogę za bardzo szaleć

Mozesz definiowac funkcje

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
0

@leaomfg:

tylko jak ten rozpisany mod zapisać jako warunek if bez tworzenia nowej funkcji?

Nie da się. A co do kodu, można też rekurencyjnie:

Kopiuj
def modulo(m n):
    if n <= m:
        return modulo(m - n, n)
    else:
        return m
jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
1

(to pseudokod, więc nie mogę za bardzo szaleć)

Wręcz przeciwnie - pseudokod wszystko skompiluje.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.