Division mit Rest bei Python selbst schreiben?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

mod gibt ja den Rest r, also a / b = c + r/b

Du erhöhst in einer Schleife x von 0 an solange um b, bis x>a werden würde.

Beispiel 17/3:
x1 = 0
x2 = 3
x3 = 6
...
x6 = 15

Dann nimmst du a - xn-1 = Rest

Im Beispiel:
17-15 = 2 = Rest
Woher ich das weiß:Studium / Ausbildung – Mathematik

Du kannst dir den Speicher für x auch sparen, wenn du einfach in einer Schleife immer

a := a-b 

rechnest, und zwar solange bis

a-b < 0 

ist. Dann steht in a der Rest. Das ist noch ein bisschen einfacher.

0
@Suboptimierer

In C sähe das so aus (ungetestet)

double Mod(double a, double b);
{
  return (a-b)<0 ? a : Mod(a-b, b);
}
0

Merci :-) Hab's zwar am Ende ein wenig anders gelöst, aber deine Idee war der Auslöser!

0
@Luxemburgerli

Das freut mich zu hören.

Natürlich gibt es mehrere Möglichkeiten, das Problem zu lösen. Der Vorteil an meiner Methode ist, dass nur Additionen/Subtraktionen durchgeführt werden, was eine geringe Komplexität des Algorithmusses bewirkt. Der Nachteil ist die Rekursion. Die meisten Programme werden bei Problemen wie 734897894357845278 mod 3 mit obigem Algorithmus aufgeben, weil der Aufrufstack zu tief geschachtelt wird.

Wenn man allerdings mehr "Handwerkszeug" hat, kommt man schneller zum Ziel. Wenn man beispielsweise schon eine Funktion hat (nennen wir sie "int"), die die Kommastellen einer Gleitkommazahl vernachlässigt, dann hätte man auch folgendes schreiben können (C):

double Mod(double a, double b)
{
  return (a/b - int(a/b)) * b;
}

Oder, was im Beispiel "734897894357845278 mod 3" günstiger wäre:

Das 10^x fache von b immer von a abziehen, also erstmal b solange *10 nehmen wie es kleiner als a ist, dann aneu = a-bneu, dann wieder b verzehnfachen, usw. oder man versucht mit einer Logarithmusfunktion gleich die Anzahl der Stellen von a herauszubekommen.

0

In Python Ton und anderer Befehl gleichzeitig ausführen?

Moin Leute,

wir schreiben gerade ein Programm mit Python , wo wir einen Ball von einem Schläger abprallen lassen und sobald er einen Block trifft soll das Programm einen Ton abspielen. Jetzt ist aber das Problem aufgetreten, dass das Programm, solange der Ton abgespielt wird, pausiert wird. Wir wollten Euch fragen, wie man diese beiden Vorgänge gleichzeitig abspielen kann?

Quellcode:

class Block:

   def __init__(self, x, y, farbe, leben):

       global canvas, STEINLAENGE, STEINBREITE

       self.x = x

       self.y = y

       self.farbe = farbe

       self.leben = leben

       self.rec = canvas.create_rectangle(self.x-STEINLAENGE/2, self.y, self.x+STEINLAENGE/2, self.y+STEINBREITE, fill=self.farbe)

   def move(self, x ,y):

       global canvas, STEINLAENGE, STEINBREITE

       self.x = x

       self.y = y

       canvas.coords(self.rec, self.x-SCHLAEGERLAENGE/2, self.y, self.x+SCHLAEGERLAENGE/2, self.y+SCHLAEGERBREITE)

   def Bloecke(self, ballx, bally):

       global schlaege, bewegungx, bewegungy, STEINBREITE, STEINLAENGE

       if (bally + RADIUS >= self.y) and (bally - RADIUS <= self.y + STEINBREITE):

           if(ballx > self.x - (STEINLAENGE/2)) and (ballx < self.x + (STEINLAENGE/2)):

               self.leben = self.leben-1

               bewegungy = bewegungy * -1

               bewegungx = bewegungx * 1

               schlaege += 1

               canvas.dchars(schlaegecounter, 0, 99999999)

               canvas.insert(schlaegecounter, 0, schlaege)

               print("gh")

               winsound.PlaySound("", winsound.SND_ALIAS)#Hier wird gesagt, dass sobald der Ball auf die Blöcke stößt, der Ball abprallt, und verschoben wird. Hierbei entsteht das Problem da der Ball unterbricht, um den Ton abzuspielen

           if self.leben < 1:

               self.move(10000000000000,1000000000000)

...zur Frage

Was möchtest Du wissen?