MOD

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Blitzkrieg Bop

Betreff: MOD

BeitragDi, Aug 31, 2004 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 31, 2004 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 31, 2004 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 31, 2004 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, habe ich mich beim testen wohl vertan, es scheint zu gehen.
Naja, wollte ja auch nochmal sichergehen! Super Wink
~ Hey Ho Let's Go ~
 

Kekskiller

BeitragDi, Aug 31, 2004 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 31, 2004 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig Very Happy
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

BeitragDi, Aug 31, 2004 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

D2006

Administrator

BeitragDi, Aug 31, 2004 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
falls dein TR ein Casio ist:
Code: [AUSKLAPPEN]

b-Frac(a/b)*b -> a


MfG
 

Blitzkrieg Bop

BeitragDi, Aug 31, 2004 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDi, Aug 31, 2004 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn a<b dann musst du schreiben a=a+b bis a>b ist.Genau verkert eben

rambo256

BeitragDi, Aug 31, 2004 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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...

BladeRunner

Moderator

BeitragDi, Aug 31, 2004 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 31, 2004 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
edit : naja egal Very Happy war falsch

rambo256

BeitragDi, Aug 31, 2004 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
jo,mist ist mir gerade auch aufgefallen...
dann überleg ich nochmal nach... Razz
Asus F53z

Das Leben ist eine reine Konkatenation...
 

Blitzkrieg Bop

BeitragDi, Aug 31, 2004 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@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 ~

BladeRunner

Moderator

BeitragDi, Aug 31, 2004 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 31, 2004 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ~

BladeRunner

Moderator

BeitragDi, Aug 31, 2004 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 31, 2004 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ~

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group