# Multiplikation durch Addition, Subtraktion und Vergleich von Zahlen



## Seatdriver87 (30. Sep 2012)

Hallo Leute,

ich beschäftige mich jetzt mit dem zweiten kniffligen Ding:


```
import java.io.*;
class multiplikation
{
public static void main (String[] args) throws IOException
{
BufferedReader stdin = new BufferedReader (new InputStreamReader(System.in));
String input;

int multiplikant;
System.out.println("Geben Sie eine ganze Zahl, den Multiplikanten ein:");
input = stdin.readLine();
multiplikant = Integer.parseInt( input ); 

int multiplikator;
System.out.println("Geben Sie eine ganze Zahl, den Multiplikator ein:");
input = stdin.readLine();
multiplikator = Integer.parseInt( input ); 

int a = multiplikant, b = multiplikator, c = 0; 

do {
         c = c + b;
         a = a - 1;  { }
       } while (a > 0);

System.out.println( c );


}
}
```

Die Aufgabe war es, eine Multiplikation durch Addition, Subtraktion und Vergleich von Ganzzahlen darzustellen. Ich habe jetzt 3 Stunden da gesessen und überlegt und bin einfach nicht drauf gekommen. Ich habe nun das obige gefunden. Ich verstehe nun nicht warum es funktioniert, kann mir das einer erklären? Möglichst für ganz dumme?!


----------



## kaetzacoatl (30. Sep 2012)

Was ist Multiplication?
2*3 ist:
2+2+2
4*5 ist:
4+4+4+4+4
Hoffe das dus verstehst


----------



## Seatdriver87 (30. Sep 2012)

kaetzacoatl hat gesagt.:


> Was ist Multiplication?
> 2*3 ist:
> 2+2+2
> 4*5 ist:
> ...



Ja soweit komm ich ja noch mit und hier habe ich auch ewig daran gesessen, dass ich Java klar mache es soll bei a * b = c 

c = a + a + ... + a --> bis a + a = a * b 

Ich verstehe es nicht ;(;(;(;(;(;(;(;(


----------



## Seatdriver87 (30. Sep 2012)

Ahhhhhhhhhhhh

Ich hab es verstanden .... 

Das ist ja voll easy ! Und ich sitz hier zehntausend Lichtjahre und es ist so einfach, ich könnt weinen  

Aber kommt man da als normalsterblicher drauf?!


----------



## Marco13 (30. Sep 2012)

Na, ich glaube du hast in Wirklichkeit nur ein paar Kilometer daran gesessen...


----------



## Firephoenix (30. Sep 2012)

Seatdriver87 hat gesagt.:


> Aber kommt man da als normalsterblicher drauf?!



Unter der Annahme das ich normalsterblich bin:

-Überlegen was man bei x*y macht, nämlich x y-mal zu sich selbst addieren.
-Für "y-mal machen" die for-schleife auspacken
-akkumulatorvariable für die summe einfügen
-das ganze in eine methode verpacken
Ergebnis:

```
public int stupidMultiply(int x, int y){
int sum = 0;
for(int i = 0; i < y; i++){
sum+=x;
}
return sum;
}
```

Gruß


----------



## jwiesmann (30. Sep 2012)

Firephoenix hat gesagt.:


> Unter der Annahme das ich normalsterblich bin:
> 
> -Überlegen was man bei x*y macht, nämlich x y-mal zu sich selbst addieren.
> -Für "y-mal machen" die for-schleife auspacken
> ...



fast 


> *... Addition, Subtraktion und Vergleich von Ganzzahlen darzustellen....*



@Firephoenix, bei dir gibt es nur Addition und Vergleich...

@Seatdriver87
Wenn du dir deine Funktion mal anschaust und einfach Werte eingibst, kommst du sicherlich schnell auf die Lösung.
Nimm einfach mal 2*3 = 6;
-->
>> a = 2;
>> b = 3;

=== ERSTER LAUF
c = 0 +3 = 3;
a = 2 -1 = 1;
============== da a>0 nochmal, Also 2ter lauf
c = 3 + 3 = 6;
a = 1-1 = 0
--> c = 6 
--> c = a*b

Im Prinzip heißt das 
Rechne solange b+b bis ich x mal a-1 abgezogen habe und a=0 raus kommt... 
Also ist es
0+3 = 3 (b beim ersten mal mit nix addieren)
2-1 = 1 (1 von a abziehen)

da a noch nicht 0 ist .. das Ganze nochmal
3+3 (da c nun 3 ist und ich einfach wieder b hinzufüge)
und 1-1 = 0....


----------



## Firephoenix (30. Sep 2012)

Offenbar bin ich bin nicht normalsterblich (ich schiebs mal auf die Uhrzeit).

Deine Rechenversion scheint auch die gesuchte zu sein, das hier würde aber sicherlich auch gehen oder :idea:


```
public int moreStupidMultiplyButWithAdditionalSubtractionFeatureIncluded(int x, int y){
int sum = 0;
for(int i = 0; i < y; i++){
sum+=x;
sum+=x;
sum-=x;
}
return sum;
}
```

[OT]Und so eine kreative Lösung zu der Uhrzeit ...[/OT]

Gruß


----------



## xehpuk (1. Okt 2012)

Marco13 hat gesagt.:


> Na, ich glaube du hast in Wirklichkeit nur ein paar Kilometer daran gesessen...


:joke:

Firephoenix, laut deiner Methode gilt: 
	
	
	
	





```
2 * (-3) = 0
```
Solange du das logisch rechtfertigen kannst, ist ja noch alles in Ordnung.


----------



## hüteüberhüte (1. Okt 2012)

Seatdriver87 hat gesagt.:


> Das ist ja voll easy ! Und ich sitz hier zehntausend Lichtjahre und es ist so einfach, ich könnt weinen



Lichtjahre ist eine Maßeinheit für Entfernungen...

4 Fälle beachten:

```
if (a < 0) {
  if (b < 0) {
    
  } else {
    
  }
} else if (b < 0) {
  
} else {
  
}
```
Und je nachdem a oder b hoch- oder runterzählen und evtl. das Vorzeichen wechseln

Und ich bin mir sicher, jeder hatte 3*3=3+3+3 in der Frundschule


----------



## Logaff (1. Okt 2012)

Theoretisch kannst du alle Funktionen dieser Welt mit folgenden Funktionen berechnen:
-2 Variablen Gleichsetzen
-Sprung zu irg einer Adresse
-Sprung zu einer Adresse bzgl != 2er Variablen
-Variable +1 rechnen
-Variable 0 setzen
-Programm beeenden

->Registermaschine

Daraus folgt das Subtraktion auf Addition zurückgeführt werden muss (macht glaub ich die ALU im CPU sowieso ?!) dementsprechend sind die Lösungen für die Grundrechenarten meist nicht zu schön ^^

Natürlich kann man den Grundbefehlssatz noch erweitern wobei jede Erweiterung durch diese Grundbefehle realisiert werden kann.


----------



## Firephoenix (1. Okt 2012)

xehpuk hat gesagt.:


> :joke:
> 
> Firephoenix, laut deiner Methode gilt:
> 
> ...



Kurz bevor man ins Bett geht noch Beiträge zu schreiben geht doch immer nach hinten los 

Hier mal eine Version die brauchbarer aussieht (dieses mal mit +, - und vergleich):


Spoiler: Spoiler





```
public static int multiply(int x, int y){
		if(x < 0){
			return - multiply(-x,y);
		}else if(y < 0){
			return - multiply(x,-y);
		}else{
			return multiplyRec(x,y);
		}
	}
	
	private static int multiplyRec(int x, int y) {
		if(x == 0){
			return 0;
		}else if( x == 1){
			return y;
		}else{
			return multiplyRec(--x,y)+y;
		}
	}

        public static void main(String args[]) {
		System.out.println(multiply(3, 4));
		System.out.println(multiply(4, 3));
		System.out.println(multiply(0, 5));
		System.out.println(multiply(4, 0));
		System.out.println(multiply(-5, 4));
		System.out.println(multiply(3, -4));
		System.out.println(multiply(-9, -1));
	}
```
Ausgabe:

```
12
12
0
0
-20
-12
9
```




Gruß


----------



## kaetzacoatl (1. Okt 2012)

[OT]





> Na, ich glaube du hast in Wirklichkeit nur ein paar Kilometer daran gesessen...


:toll::toll::toll::toll::toll::toll::toll::toll:
:lol::lol::lol::lol::lol::lol::lol::lol::lol:

Das muss ich mir merken
[/OT]


----------



## langhaar! (1. Okt 2012)

Logaff hat gesagt.:


> Theoretisch kannst du alle Funktionen dieser Welt mit folgenden Funktionen berechnen:
> ...
> 
> ->Registermaschine



Öhhh...
Nein.
Informatik

:rtfm:


----------



## Logaff (1. Okt 2012)

Failing at Klugs******en^^

Ja natürlich du kannst alle BERECHENBAREN ZAHLENFUNKTION von N* -> N durch eine Registermaschine realisieren welche äquivalent ist zu der Turingmaschine und somit zu unseren normalen Computer.


----------

