MOD
Übersicht

Blitzkrieg BopBetreff: MOD |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Ich habe eine Frage: Wie könnte ein Codeschnipsel aussehen, mit dem man den Divisionsrest zweier Zahlen bestimmt, ohne das man den Mod-Operator dafür gebraucht? Also das es geht, weiß ich - nur irgendwie will es mir nicht gelingen, das hinzukriegen. Also der Trick ist einfach: Die eine Zahl solange von der anderen subtrahieren, bis es nicht mehr geht und schwups hat man den Rest. Doch entweder stimmt mein Code nicht, oder es geht anders. Code: [AUSKLAPPEN] Graphics 640,480 a = 43 b = 11 Repeat a=a-b Until (a<b) Print "Divisionsrest: "+a WaitKey() : End MFG |
||
~ Hey Ho Let's Go ~ |
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ALso ich weiß nicht was du hast,aber bei mir ist das richtig...
"Beweis": Code: [AUSKLAPPEN] Graphics 640,480
a = 8 b = 3 Repeat a=a-b Until (a<b) Print "Divisionsrest: "+Float(a) Print "Divisionsrest: "+Float((a Mod b)) WaitKey() : End |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bei mir gehts, von daher verstehe ich das Problem nicht.
43 mod 11 = 10 |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Blitzkrieg Bop |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm, habe ich mich beim testen wohl vertan, es scheint zu gehen.
Naja, wollte ja auch nochmal sichergehen! Super ![]() |
||
~ Hey Ho Let's Go ~ |
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nur frage ich mich jetzt, warum du unbedingt so eine unvorteilhafte Art der
Divions-Rest-Ermittlung nutzen willst. Mod ist klein, schnell und praktisch. Das andere kommt da wohl kaum ran. |
||
Blitzkrieg Bop |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Richtig ![]() Leider unterstützt mein TR kein Mod(glaube ich zu wissen). Und die Aufgabe war, nen "Mini Algo" zu entwerfen, das der dir den Divi.Rest ausgibt. Und so wie es hier steht, habe ich es auf den TR übersetzt/programmiert und es geht. |
||
~ Hey Ho Let's Go ~ |
![]() |
simi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich würd das so machen:
Code: [AUSKLAPPEN] Function Mod1(Dividend,Divisor) return Dividend - (Floor(Dividend/Divisor)*Divisor) end Function Habs nicht getestet, sollte aber gehen |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
falls dein TR ein Casio ist:
Code: [AUSKLAPPEN] b-Frac(a/b)*b -> a MfG |
||
Blitzkrieg Bop |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@D2006: Danke, aber geht nicht - bin Besitzer eines TI.
@all: Frage: Wenn man bei meinem Code a = - 7 b = 3 einsetzt, kommt nach meiner Rechnung für a raus: -10 und wenn man direkt a mod b schreibt: -1 Was genau ist da nun falsch? Hier dann nochmal der Source: Code: [AUSKLAPPEN] Graphics 640,480 a = -7 b = 3 Repeat a=a-b Until (a<b) Print "Divi.Rest: "+a Print "Mod Version Divi.Rest: "+a Mod b WaitKey() : End |
||
~ Hey Ho Let's Go ~ |
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn a<b dann musst du schreiben a=a+b bis a>b ist.Genau verkert eben | ||
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde das so machen:
Code: [AUSKLAPPEN] Graphics 640,480 a = -6 b = 3 Repeat If a <0 Then a=b-a Else a = a-b EndIf Until (a<b) Print "Divi.Rest: "+a Print "Mod Version Divi.Rest: "+a Mod b WaitKey() : End Müsste funzen |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] a=abs(a)
b=abs(b) ...und du sparst dir den if-Krempl. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
edit : naja egal ![]() |
||
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
jo,mist ist mir gerade auch aufgefallen...
dann überleg ich nochmal nach... ![]() |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
Blitzkrieg Bop |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@BladeRunner:
Hm...das habe ich mir auch gedacht, einfach die negativen Werte positiv drehen, aber ist das dann noch richtig? Also wenn man sich dann das zum Beispiel anguckt, wird dann nicht das Ergebnis verfälscht?: Code: [AUSKLAPPEN] Graphics 640,480 a = -7 b = 3 a = Abs(a) b = Abs(b) Repeat a = a - b Until (a<b) Print "Divi.Rest: "+a Print "Mod Version Divi.Rest: "+(-7 Mod 3) WaitKey() : End |
||
~ Hey Ho Let's Go ~ |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du erhälst natürlich das "absolute" Ergebnis. Wenn du negative Modwerte haben willst, prüfe ob einer der Werte <0 ist, wenn ja nimm das ergebnis mit -1 mal.
also: Code: [AUSKLAPPEN] fac=1 if (a<0 and b>0) or (a>=0 and b<0) then fac=-1 ;mod berechnen a = Abs(a) b = Abs(b) Repeat a = a - b Until (a<b) a=a*fac |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Blitzkrieg Bop |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und warum reicht dann nicht diese Abfrage, Blade?:
Code: [AUSKLAPPEN] If a<0 Or b<0 Then fac = - 1 ? Und nochmal zur Verstädnis: Man prüft, ob A oder B negativ sind. Sollte das der Fall sein, weiß man, das wenn man die negierten Werte mit abs() positiv macht, im Grunde die Ergebnisse verfälscht sind und deshalb mit *(-1) multipliziert werden. Sind beide Zahlen im positiven Bereich, wird mit *1 multipliziert, wobei dann das Ergebnis gleich bleibt. Ist das alles richtig, oder gibt es was zu ergänzen? Ich will das ja auch schließlich verstehen! |
||
~ Hey Ho Let's Go ~ |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein du musst getrennt abfragen, da OR auch True ist wenn BEIDE negativ sind.
Da aber - *- = + ist darf nur eine Teilbedingung war sein. Daher der etwas kompliziertere Term. Aber vom Prinzip her hast du es schon erfasst. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Blitzkrieg Bop |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich glaube ich habe es verstanden, also:
Wenn ich nur Frage: If b<0 or a<0 then fac=-1 , dann kann es durchaus passieren, das fac=-1 ist, wenn beide Zahlen negativ sind. Doch fac darf nur -1 sein, wenn auch im Anfangsergebnis was negatives rauskommt. Beispiel: A = -2 B = 5 A/B = -x : fac = -1 Das gleiche gilt, wenn B negativ und A positiv ist. Sind jedoch beide positiv: A=2 B=2 A/B = x : fac = 1 (!) und fac muss eben auch 1 sein, wenn zwei Zahlen negativ sind, weil gilt: minus mal minus ergibt plus. Aber da fällt mir ein, dann könnte man die If ABfrage auch anders machen und zwar so: Code: [AUSKLAPPEN] If (A/B) < 0 ;ist das ergebnis ne minuszahl fac = - 1 else fac = 1 endif oder irre ich da? |
||
~ Hey Ho Let's Go ~ |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group