# division mit rest



## jazzcookie (11. Nov 2009)

hi,
ich habe folgendes problem.ich soll ein programm schreiben, dass eine division mit rest genau so durchfuehrt wie man es in der schule auf dem papier gelernt hat.also ca. so:

142 / 11 = 12 Rest 10
11
--
 32
 22
 --
 10

als parameter habe ich nur den dividend und den divisor(beide int).die erste zeile ausgeben zu lassen ist noch kein problem:

int p=dividend/divisor;
		int s=dividend-p*divisor;
		System.out.println(dividend+"/"+divisor+"="+p+"Rest"+s);

fuehrt zu

142 / 11 = 12 Rest 10


fuer dividend 142 und divisor 11.
interessant fuer mich waere:wie mache ich dem computer klar das er von der 142 erst mal nur die 14 betrachten soll?
schreibt mir wenn ihr eine idee habt die mir weiterhelfen koennte

thx thx


----------



## faetzminator (11. Nov 2009)

Probier es mit [c]dividend/Math.pow(10, (int) Math.log10(divisor))[/c], Wenn das nicht klappt mit [c]Math.log10(divisor) - 1[/c] versuchen etc.


----------



## Marco13 (11. Nov 2009)

Hm. Ob das so stimmt? Ich glaube nicht...!? ???:L

Von der Idee her stimmt's aber: Du brauchst eine Methode, die ungefähr sowas macht wie

```
int gibMirEineZahlDieAusDenErstenStellenBestehtVon(int dieserZahl, int undDieGrößergleichDieserZahlIst)
{
    ...
}
```
Also bei 34562 / 1234 will man ja testen:
3 / 1234 -> Macht hier keinen Sinn
34 / 1234 -> Macht hier keinen Sinn
345 / 1234 -> Macht hier keinen Sinn
3456 / 1234 -> Jo, das passt, also rechnet man 3456/1234 und hat die erste Stelle des Ergebnisses...


----------



## faetzminator (11. Nov 2009)

Hier ein Beispiel, welches iterativ jeweils eine Stelle ausgibt:

```
void dividiere(int dividend, int divisor) {
    int i;
    while ((i = (int) Math.pow(10, (int) Math.log10(dividend / divisor))) != 0) {
        int p = dividend / i / divisor;
        dividend -= p * divisor * i;
        System.out.print(p);
    }
    System.out.println(" r: " + dividend % divisor);
}
```


----------



## Marco13 (11. Nov 2009)

Vielleicht habe ich da ja was falsch verstanden, aber ... das mit dem log10 ist halt praktisch, wenn man mit einzelnen Stellen rumhantieren will... aber ob in einem Programm zum ""schrifltlichen" Dividieren mit Rest" ein "dividend/divisor" oder der Operator % vorkommen sollte (den man hier aber auch leicht weglassen könnte) weiß ich gerade nicht...


----------



## faetzminator (11. Nov 2009)

Wie würdest du das sonst machen? Die einzige Möglichkeit, die mir gerade einfällt, wär, dass man String.valueOf() verwendet und die benötigten Stellen wieder in einen int schreibt...


----------



## diggaa1984 (11. Nov 2009)

es wär schon ne kleine fummelei aber man kann das auch in einer schleife lösen (mit dieser stellen-frickelei) .. solange (rest >= divisor) .. wobei der rest eben den wirklichen rest vom dividenden beschreibt .. und nich den rest der teilrechnung


----------



## Michael... (11. Nov 2009)

Sollte doch nicht so schwer sein, wenn man die schriftliche Division beherrscht.
Bsp. 142 :11
Per Schleife - entsprechend der Stellenanzahl des Dividenden - iterieren (3x) = (int)Math.log10(dividend)
darin den relevanten Teil ermitteln --> 1 
durch den Divisor teilen 1 / 11 --> 0
Ergebnis entsprechend der Wertigkeit der Stelle mit Divisor multiplizieren 0 x 11 x 100 --> 0
dieses vom Dividenden abziehen 142 - 0 --> 142

2. Schleifendurchlauf
relevanter Teil --> 14
14 / 11 -->  1
1 x 11 x 10 --> 110
142 - 110  -->32

3. Schleifendurchlauf
relevanter Teil --> 32
32 / 11 -->  2
2 x 11 x 1 --> 22
32 - 22  -->10

die Zwischenerbnisse müssen natürlich in Variablen gespeichert werden.


----------



## Marco13 (11. Nov 2009)

faetzminator hat gesagt.:


> Wie würdest du das sonst machen? Die einzige Möglichkeit, die mir gerade einfällt, wär, dass man String.valueOf() verwendet und die benötigten Stellen wieder in einen int schreibt...



Ja, das Stellengewurschtel ist eben ein bißchen frickelig. Da log10 zu verwenden ist an sich legitim, und alles, was man als Alternative macht, kann ja nur "mathematisch equivalent" zu dem sein. Aber wenn man schriftlich dividiert, rechnet man keine logarithmen aus, sondern man nimmt einzelne Stellen einer Zahl und schiebt sie hin und her. 

Ich hab's jetzt mal implementiert mit Methoden
getDigitL(zahl, n) : Liefert die n-te Stelle von links
appendDigitR(zahl, d) : Hängt die Ziffer d rechts and eine Zahl
die intern NUR *,/ und % 10 verwenden (also genau das verschieben einer Zahl nach links oder rechts und das Abtrennen einer Ziffer), dann reduziert sich das auf das, was man wirklich bei schriftlicher Division rechnet

```
while (index < length)
        {
            remainder = appendDigitR(remainder, getDigitL(dividend, index++));
            int digit = remainder / divisor;
            result = appendDigitR(result, digit);
            remainder -= digit * divisor;
        }
```

Nochmal: Ich gehe eben davon aus, dass das Ziel der Aufgabe nicht ist, sowas zu schreiben wie

```
int result = (dividend / divisor);
    int remainder = (dividend % divisor);

    // Jetzt gibt die Zwischenschritte aus, die man
    // bei schriftlicher Division machen würde:
    while (...) { ... }
```
(jaja, das hattest du nicht, aber ich vermute eben, dass es nicht zuletzt um diese "magischen" Ziffer-Hantier-Methoden ging... )


----------

