kleinster gemeinsamer teiler mit modulo
slakmann
- javascript
hallo,
ich wollte mit hilfe von modulo ein javascript schreiben, welches von 2 zahlen den kleinsten gemeinsamen teiler ermittelt (1 ausgenommen; also ab 2).
meine lösung siehe unten.
nur ich habe ein problem:
er gibt immer die zahl aus, die ich bei der for-schleife bei i definiert habe +1. also ich fange (wie im bsp. i=2 an, gibt er IMMER 3 aus. i=3 gibt er immer 4 aus und i=1 gibt er immer 2 aus.
meiner meinung nach müsste das script logisch korrekt sein. bitte helft mir.
danke.
<html>
<head>
<title>Modulo einer Zahl</title>
<script language="javascript">
<!--
function fenster()
{
var zahl1 = Number(document.eingabe.zahl1.value);
var zahl2 = Number(document.eingabe.zahl2.value);
/* erg1+erg2 beides != 0 damit er überhaupt erstmal in die
schleife reingeht.
*/
var erg1 = 1;
var erg2 = 2;
/* i fängt bei 2 an da 1 immer der kleinste gemeinsamer teiler ist.
i zählt hoch da wir bei der ersten gefunden zahl das ergebnis haben
und nicht mehr weiter rechnen brauchen.
erg1!=0 && erg2!=0
Die schleife soll solange laufen, bis bei beiden rest 0 gleichzeitig
gefunden wurde.
*/
for (var i=2; erg1!=0 && erg2!=0; i++)
{
//bei beiden den rest ausrechnen.
erg1=zahl1/i;
erg2=zahl2/1;
// folgendes ist nur eine verhinderung einer möglichen endlosschleife.
if( i >= zahl1)
{
/* Wenn der zähler größer ist als die kleinste zahl, wird er nie einen
gemeinsamen teiler finden. ob wir zahl1 oder zahl2 abrufen ist egal
wir brauchen nicht wissen welche die kleinere ist. weil wenn wir
die größere erwischen, haben wir die kleinere eh schon längst
erreicht.
somit wird i auf 1 gesetzt und die schleife beendet.
*/
i=1;
break;
}
}
alert ('Der kleinste gemeinsamer Teiler ist: ' + i);
}
-->
</script>
<noscript>
Sie haben kein JavaScript aktiviert. Schämen Sie sich!
</noscript>
</head>
<body>
<h1>
Kleinster gemeinsamer Teiler
</h1>
Ab 2, da 1 immer der kleinste gemeinsamer Teiler ist.<br>
Wenn ab 2 keinen gefunden wurde, wird 1 genommen.<br><br>
<form name="eingabe">
<b>Zahl1:</b>
<input type="text" name="zahl1" maxlength="6" size="6">
<br>
<b>Zahl2:</b>
<input type="text" name="zahl2" maxlength="6" size="6">
<br><br>
<input type="submit" name="senden" value="Senden" onclick="fenster();">
<br>
</form>
</body>
</html>
hoppla,
ich habe da einen kleinen tippfehler.
es muss heißen:
//bei beiden den rest ausrechnen.
erg1=zahl1%i;
erg2=zahl2&1;
anstatt:
//bei beiden den rest ausrechnen.
erg1=zahl1/i;
erg2=zahl2/1;
hatte zwischendurch was anderes ausprobiert. trotzdem bleibt das problem bei modulo.
man ey, schonwieder *grr*
beides modulo natürlich. also:
//bei beiden den rest ausrechnen.
erg1=zahl1%i;
erg2=zahl2%1;
man ey, schonwieder *grr*
beides modulo natürlich. also:
//bei beiden den rest ausrechnen.
erg1=zahl1%i;
erg2=zahl2%1;
Bist Du sicher, daß Du den _kleinsten_ gemeinsamen Teiler suchst?
Viele Grüße,
Reiner
man ey, schonwieder *grr*
beides modulo natürlich. also:
//bei beiden den rest ausrechnen.
erg1=zahl1%i;
erg2=zahl2%1;Bist Du sicher, daß Du den _kleinsten_ gemeinsamen Teiler suchst?
Viele Grüße,
Reiner
ja weil i bei 2 anfängt und mit i++ immer höher geht. also fängt er unten an.
und ausserdem ist das nur eine übung für mich die ich lösen will. ob es sinnvoll ist, sei dahingestellt.
habe den fehler nun gefunden.
bei dem 2. habe ich %1 anstatt %i gschrieben.
*mitdemkopfaufdentischhau*
Hallo slakmann,
Bist Du sicher, daß Du den _kleinsten_ gemeinsamen Teiler suchst?
ja weil ...
der kleinste gemeinsame Teiler ist immer die Eins. Du suchst den größten gemeinsamen Teiler, den ggT, der nicht mit dem kleinsten gemeinsamen Vielfachen, dem kgV, verwechselt werden sollte.
Gruß, Jürgen
Hallo slakmann,
Bist Du sicher, daß Du den _kleinsten_ gemeinsamen Teiler suchst?
ja weil ...
der kleinste gemeinsame Teiler ist immer die Eins. Du suchst den größten gemeinsamen Teiler, den ggT, der nicht mit dem kleinsten gemeinsamen Vielfachen, dem kgV, verwechselt werden sollte.
Gruß, Jürgen
ja ich weiss dass die 1 immer der kleinste gemeinsamer teiler ist. dann halt eben den 2. kleinsten gemeinsamen teiler. hauptsache eine übung zum lernen.
trotzdem danke
Hallo slakmann,
... hauptsache eine übung zum lernen.
ach so.
Gruß, Jürgen
Moin!
<html>
<head>
<title>Modulo einer Zahl</title>
<script language="javascript">
<!--
function fenster()
{
var zahl1 = Number(document.eingabe.zahl1.value);
var zahl2 = Number(document.eingabe.zahl2.value);
// Wir brauchen höchstens bis zur
// Quadratwurzel der größeren Zahl zu suchen
// Wenn diese aber größer ist, als die kleinere der beiden Zahlen
// brauchen wir nur bis zu dieser kleineren Zahl zu suchen
var max;
if ( zahl1 > zahl2 ) {
max= Math.floor( Math.sqrt( zahl1 ));
if ( max > zahl2 ) {
max= zahl2;
}
}
else {
max= Math.floor( Math.sqrt( zahl2 ));
if ( max > zahl1 ) {
max= zahl1;
}
}
var kgt= 1;
// Ab 3 önnen wir in 2er Schritten weitersuchen
var step= 1;
for (var i=2; i<=max; i+= step, step=2)
{
//bei beiden den rest ausrechnen.
var erg1=zahl1 % i;
var erg2=zahl2 % i;
if ( erg1==0 && erg2==0 ) { // Lösung gefunden
kgt= i;
break;
}
}
alert ('Der kleinste gemeinsamer Teiler ist: ' + kgt);
}
-->
</script>
<noscript>
Sie haben kein JavaScript aktiviert. Schämen Sie sich!
</noscript>
</head>
<body>
<h1>
Kleinster gemeinsamer Teiler
</h1>
Ab 2, da 1 immer der kleinste gemeinsamer Teiler ist.<br>
Wenn ab 2 keinen gefunden wurde, wird 1 genommen.<br><br>
<form name="eingabe">
<b>Zahl1:</b>
<input type="text" name="zahl1" maxlength="6" size="6">
<br>
<b>Zahl2:</b>
<input type="text" name="zahl2" maxlength="6" size="6">
<br><br>
<input type="submit" name="senden" value="Senden" onclick="fenster();">
<br>
</form>
</body>
</html>
-- Skeeve
Moin!
Korrektur! Wir können nicht bis zur Quadratwurzel suchen, wenn wir nicht den Schleifeninhalt ändern. Wir müssen bis zum Minimum von Zahl1 und Zahl2 suchen!
Also ändere
// Wir brauchen höchstens bis zur
// Quadratwurzel der größeren Zahl zu suchen
// Wenn diese aber größer ist, als die kleinere der beiden Zahlen
// brauchen wir nur bis zu dieser kleineren Zahl zu suchen
var max;
if ( zahl1 > zahl2 ) {
max= Math.floor( Math.sqrt( zahl1 ));
if ( max > zahl2 ) {
max= zahl2;
}
}
else {
max= Math.floor( Math.sqrt( zahl2 ));
if ( max > zahl1 ) {
max= zahl1;
}
}
zu
~~~javascript
var max= zahl1 > zahl2 ? zahl2 : zahl1;
-- Skeeve
Hallo Skeeve,
<noscript>
Sie haben kein JavaScript aktiviert. Schämen Sie sich!
</noscript>
</head>
Der noscript-Bereich enthält nur Text bzw. HTML-Code und sollte daher nicht im head-, sondern im body-Bereich liegen.
<body>
<h1>
Kleinster gemeinsamer Teiler
</h1>
Ab 2, da 1 immer der kleinste gemeinsamer Teiler ist.<br>
Wenn ab 2 keinen gefunden wurde, wird 1 genommen.<br><br>
also wird er zweitkleinste Teiler gesucht. Immerhin besser als in der Politik, die ja (fast) immer mit dem kleinsten gemeinsamen Nenner zufrieden ist.
Gruß, Jürgen
Moin, Jürgen!
Der noscript-Bereich enthält nur Text bzw. HTML-Code und sollte daher nicht im head-, sondern im body-Bereich liegen.
Erzähl das nicht mir sondern dem OP.
also wird er zweitkleinste Teiler gesucht. Immerhin besser als in der Politik, die ja (fast) immer mit dem kleinsten gemeinsamen Nenner zufrieden ist.
Erzähl das nicht mir sondern dem OP.
;-)
-- Skeeve
Hi!
/* Wenn der zähler größer ist als die kleinste zahl, wird er nie einen
gemeinsamen teiler finden. ob wir zahl1 oder zahl2 abrufen ist egal
wir brauchen nicht wissen welche die kleinere ist. weil wenn wir
die größere erwischen, haben wir die kleinere eh schon längst
erreicht.
GANZ schlechter Programmierstil. Wenn eine Zahl jetzt exorbitant größer ist als die andere, läuft die Schleife unnötig oft durch. Bsp.: Zahl eins ist 9231298464413382391, Zahl zwei ist 2.
mfG
Hi!
/* Wenn der zähler größer ist als die kleinste zahl, wird er nie einen
gemeinsamen teiler finden. ob wir zahl1 oder zahl2 abrufen ist egal
wir brauchen nicht wissen welche die kleinere ist. weil wenn wir
die größere erwischen, haben wir die kleinere eh schon längst
erreicht.
GANZ schlechter Programmierstil. Wenn eine Zahl jetzt exorbitant größer ist als die andere, läuft die Schleife unnötig oft durch. Bsp.: Zahl eins ist 9231298464413382391, Zahl zwei ist 2.mfG
ja ich weiss. das war mir auch bewusst. nur war es erstmal für mich so einfacher.
als das problem beseitigt war, habe ich diese überprüfung selbstverständlich mit eingebaut.
Moin!
Noch 'ne Variante:
<html>
<head>
<title>Modulo einer Zahl</title>
<script language="javascript">
<!--
function ggt(a, b) {
if ( b == 0 ) {
return a;
}
return ggt( b, a % b );
}
function fenster()
{
var zahl1 = Number(document.eingabe.zahl1.value);
var zahl2 = Number(document.eingabe.zahl2.value);
var kgt= ggt(zahl1, zahl2);
var max= Math.sqrt(kgt);
// Ab 3 können wir in 2er Schritten weitersuchen
var step= 1;
for (var i=2; i<=max; i+= step, step=2)
{
if ( kgt % i == 0 ) { // Lösung gefunden
kgt= i;
break;
}
}
alert ('Der kleinste gemeinsamer Teiler ist: ' + kgt);
}
-->
</script>
<noscript>
Sie haben kein JavaScript aktiviert. Schämen Sie sich!
</noscript>
</head>
<body>
<h1>
Kleinster gemeinsamer Teiler
</h1>
Ab 2, da 1 immer der kleinste gemeinsamer Teiler ist.<br>
Wenn ab 2 keinen gefunden wurde, wird 1 genommen.<br><br>
<form name="eingabe" onsubmit="return false">
<b>Zahl1:</b>
<input type="text" name="zahl1" maxlength="6" size="6">
<br>
<b>Zahl2:</b>
<input type="text" name="zahl2" maxlength="6" size="6">
<br><br>
<input type="submit" name="senden" value="Senden" onclick="fenster();">
<br>
</form>
</body>
</html>
-- Skeeve