Äthopisches multiplizieren

GroveStreet

Mitglied
Hi Leute, ich als Programmieranfänger brauche eure Hilfe.... Die Aufgabe : Äthopisches Multiplizieren... Bsp. : 17*34 --> die linke Zahl wird immer halbiert(Komma wird abgeschnitten) bis sie gleich 1 ist. Die rechte zahl wird solange verdoppelt. Ist die linke Zahl, die halbiert wird (17), ohne Rest durch 2 teilbar, dann wird die dazugehörigen rechte Zahlen (34 usw....) addiert.

Bei mir gibt das Programm als ergebnis immer 0 aus. findet ihr meinen Fehler?
Ich hoffe ich konnte die aufgabenstellung gut formulieren🙂
 

Anhänge

  • Äthopisches Multiplizieren1.PNG
    Äthopisches Multiplizieren1.PNG
    11 KB · Aufrufe: 49
  • Äthopisches Multiplizieren2.PNG
    Äthopisches Multiplizieren2.PNG
    15,3 KB · Aufrufe: 46
Poste doch bitte mal deinen aktuellen code hier, dann kann man ihn kopieren (zum testen) und zitieren ....
Oder du debugst mal und schaust dir an was er so treibt
 
Ich verstehe nicht ganz was das Program machen soll...
Es gibt diese for-Schleife, in der du a solange durch 2 teilst, wie a ... gleich 1 ist.
Sollte a also gleich 1 sein, wird es ein mal durch 2 geteilt, und ist dann gleich 0

Abgesehen davon verwendest du a und b nach dieser for Schleife nie wieder, also egal was du dabei ausrechnest (oder ausrechnen mchstest) wird im nachfolgenden Teil nicht mehr verwendet.
Auch ist die if-Anweisung mit x>0 && y>0 unnötig, da anderenfalls bereits 0 als ergebnis zurrückgegeben wurde (Unter der Annahme, dass beide Argumente positiv sein müssen).

Zudem, anstatt

int erg = 0;
return erg = 0;

schreibe einfach return 0;
zudem würde man im Normalfall nicht return erg = 0; sondern höchstens return erg; schreiben (erg ist bereits 0, und mussnicht in der return anweisung neu gesetzt werden)
 
import java.util. Scanner;
public class AathopischesMultiplizieren {


public static int rechnen (int x, int y){
int a=x;
int b=y;
int z=0;
int erg=0;
if(x==0||y==0){
return 0;
}//end of if

if(x>0 && y>0){
for(int i=0;a==1;i++){
a=a/2;
b=b*2;
z++;
}//end of for
int [] multi_e=new int[z];
int[] multi_z=new int[z];
for(int k=0;k<z;k++){
x=x/2;
y=y*2;
multi_e[k]=x;
multi_z[k]=y;
}//end of for
for(int d=0;d<z;d++){System.out.println(multi_z[d]);}
for(int l=0;l<z;l++){
if(multi_e[l]%2==0){
erg=erg+multi_z[l];
}//end of if
}//end of for

}//end of if
return erg;
}//end of method

public static void main (String[]args){
Scanner sc_ref=new Scanner(System.in);
System.out.println("Erster Multiplikator eingeben!");
int x = sc_ref.nextInt();
System.out.println("Zweiter Multiplikator eingeben");
int y = sc_ref.nextInt();
sc_ref.close();

int erg=AathopischesMultiplizieren.rechnen(x, y);
System.out.println("Ergebnis:"+erg);
}//end of main
}//end of class
 
Hab Eure Verbesserungen eingebaut und es funktioniert!! Geil! Danke euch!!! Hatte aber auc heinen kleinen formulierungsfehler in meiner Beschreibung. Nächstes mal poste ich einfach die Aufgabenstellung mit hoch😛
Ich klatsch mal den neuen Quellcode dazu :
import java.util. Scanner;
public class AathopischesMultiplizieren {


public static int rechnen (int x, int y){
int a=x;
int b=y;
int z=0;
int erg=0;
if(x==0||y==0){
return 0;
}//end of if

if(x>0 && y>0){
for(int i=0;a!=0;i++){
a=a/2;
b=b*2;
z++;
}//end of for
int [] multi_e=new int[z];
int[] multi_z=new int[z];
for(int k=0;k<z;k++){
multi_e[k]=x;
multi_z[k]=y;
x=x/2;
y=y*2;
}//end of for

for(int d=0;d<z;d++){System.out.println("Rechte Spalte"+multi_z[d]+"\t");}//end of for
for(int d=0;d<z;d++){System.out.println("Linke Spalte"+multi_e[d]+"\t");}//end of for
System.out.println("Länge Array:"+multi_z.length);

for(int l=0;l<z;l++){
if(multi_e[l]%2!=0){
erg=erg+multi_z[l];
}//end of if
}//end of for

}//end of if
return erg;
}//end of method

public static void main (String[]args){
Scanner sc_ref=new Scanner(System.in);
System.out.println("Erster Multiplikator eingeben!");
int x = sc_ref.nextInt();
System.out.println("Zweiter Multiplikator eingeben");
int y = sc_ref.nextInt();
sc_ref.close();

int erg=AathopischesMultiplizieren.rechnen(x, y);
System.out.println("Ergebnis:"+erg);
}//end of main
}//end of class
 
Noch ein paar Verbesserungsvorschläge:

for(int i=0;a!=0;i++) -Schleife kannst du zu einer while(a!=0) Schleife umbauen, da du in der for Schleife weder das "i" benutzt, noch das i in der Abbruchbedingun der for Schleife benutzt wird.
Das b=b*2 kannst du dir auch sparen, da du dieses b Später nie benutzt (einziger Sinn der For-SChleife: auszurechnen, welches die kleinste Power of 2 ist, die größer als die Eingangsvariable x ist.)
Die Variable b musst du auch überhaupt nicht deklarieren, da die einzige Nutzung wegen oben genantem Punkt wegfällt.

Die if(x>0 && y>0) Anweisung kannst du dir auch sparen, siehe meinen vorherigen Post.

Anstatt der ganzen x=x*2, y=y/2 etc. schreib doch einfach x*=2 und y/=2 etc. (Ist kürzer und IMHO besser lesbar)
 

Zurück
Oben