Schriftliche Addition Arrays

Hallo!

Ich habe folgende Aufgabe erhalten:
Addieren beliebig großer natürlicher Zahlen

Natürliche Zahlen lassen sich als einzelne Ziffern in int-Arrays repräsentieren. Damit kann man beliebig
große Zahlen darstellen.
Günstig für viele Berechnungen ist es, wenn die Ziffern in umgekehrter Reihenfolge gespeichert werden.
Beispielsweise stellt das Array f 1, 2, 3, 4, 5, 6, 7, 8 g die Zahl 87.654.321 dar, d.h. die Ziffer der letzten Stelle
steht immer beim Index 0.
Schreiben Sie eine Methode int[] add(int[] a, int[] b), die zwei auf diese Art repräsentierte Zahlen der gleichen
Länge als Parameter hat und ein neues Array berechnet, das die Summe der beiden Zahlen repräsentiert.
Die Methode soll so arbeiten, wie Sie das vom ”schriftlichen Addieren“ her kennen. Das Ergebnis-Array
ist möglicherweise um eine Stelle länger als die beiden Arrays a und b, falls es bei der letzten Addition
einen Übertrag gibt. Sie dürfen auch ein Ergebnis-Array liefern, das um 1 länger als die minimal benötigte
Stellenzahl sind (die ”führende 0“ ändert ja nicht den Wert).
Beispiel 1234 + 5678 = 6912: Arrays a = f 4, 3, 2, 1 g, b = f 8, 7, 6, 5 g, Ergebnis = f 2, 1, 9, 6, 0 g.
Beispiel 9998 + 2 = 10000: Arrays a = f 8, 9, 9, 9 g, b = f 2 g, Ergebnis = f 0, 0, 0, 0, 1 g.
Erstellen Sie die Methode boolean testArrays(int[] a, int[] b), die testet, ob beide Arrays definiert,
die Länge jeweils gleich und > 0 und alle Ziffern zwischen 0 und 9. add soll die Methode verwenden.

Ich habe mich auch schon ausgiebig mit der Aufgabe auseinandergesetzt, komme aber nicht wirklich weiter. Das habe ich bis jetzt:

            //Voraussetzung ist, dass a und b die gleiche Länge haben
            int [] c=new int [a.length+1]; //Feld für Ergebnis
            int i;  //Schleifenzähler
            int s;  //Summe der aktuell berechneten Stelle
            int uebertrag = 0; //Übertrag für die nächste Stelle
            
            for (i=0; i<c.length-1; i=i+1){
                s=a**+b**;
                c**= (s+uebertrag) % 10;
                uebertrag = s/10;
            }
            c[c.length-1]=uebertrag;
            return c;
   }```

Wäre lieb, wenn sich jemand kurzfristig melden könnte, wenn er helfen kann, ist nämlich dringend! Ich bin dankbar für jede Hilfe :) Vielen Dank!

Damit kann man beliebig große Zahlen darstellen.
stimmt zwar nicht da ein Array nur maximal Interger.MAX_VALUE Felder halten kann…

Zum Code: Es wird nicht berücksichtigt, dass a und b unterschiedlich lang sein können.

Erstmal danke! Ja, dass mit dem beliebig wurde dann doch noch so eingeschränkt! Wie kann man das denn implementieren, dass a und b unterschiedlich lang sein können und irgendwo müssen ja auch die Arrays eingelesen werden oder wie kann ich das am besten machen?

*** Edit ***

Ach, das mit der unterschiedlichen Länge hat sich ja praktisch dadurch erledigt, dass Nullen für die fehlenden Indexwerte eines Arrays eingesetzt werden können. Doch der Quelltext ist ja so nicht fertig oder?

Bei der Größe von a und b könntest du entweder erst c die Länge von a zuweisen und dann nochmal korrigieren, falls b länger ist.
Oder aber erstmal gucken, ob a länger als b ist, dann c an die Länge von a anpassen, und falls a nicht länger ist, dann c an die Länge von b anpassen.

Okay, wenn das mit der Länge aber egal ist, der Code wäre ja nicht ausreichend. Wie und wo kann ich die Arrays definieren…in der Main-Methode? Und wie findet die Ausgabe statt? Ich steh auf dem Schlauch :smiley: Danke schonmal!

*** Edit ***

Ich war auch schonmal so weit, aber das ist explizit für Zahlen mit 50 Stellen…

import java.util.*;

public class AdditionArray {

public static int [] add (int []a, int []b){
//Voraussetzung ist, dass a und b die gleiche Länge haben
int [] c=new int [a.length+1]; //Feld für Ergebnis
int i; //Schleifenzähler
int s; //Summe der aktuell berechneten Stelle
int uebertrag = 0; //Übertrag für die nächste Stelle

for (i=0, i<c.length-1; i=i+1){
s=a**+b**;
c**= (s+uebertrag) % 10;
uebertrag = s/10;
}
c[c.length-1]=uebertrag;
return c;
}
public static void ausgeben (String s, int [] feld){
int i;
System.out.println (s);
for (i=feld.length-1; i>=0; i=i-1)
System.out.print (feld **);
System.out.println ();
}
public static void main (String [] args){
int anzS=50; //Anzahl der Stellen
int [] zahl1 = new int [anzS]; //1.Summand
int [] zahl2 = new int [anzS]; //2.Summand
int [] zahl3; //Ergebnis

//die beiden Summanden mit zufälligen Werten belegen
Random r= new java.util.Random ();
for (int i=0; i<anzS; i++){
zahl1**= r.nextInt (10);
zahl2**= r.nextInt (10);

}
//Ergebnis berechnen und ausgeben
zahl3=add (zahl1, zahl2);
ausgeben ("1.Summand:", zahl1);
ausgeben ("2.Summand:", zahl2);
ausgeben ("Summe:"+zahl3);

}
}```

Bei 50 ist es vielleicht ungeschickt die Ziffern zeilenweise auszugeben. Wo gibt es da ein Problem?

Ansonsten liegt noch ein Fehler bei der Berechnung des Übertrags bzw s.

Kann jemand den Quelltext vielleicht so korrigieren, dass die Stellen nicht auf eine bestimmte Zahl definiert sind, wie oben auf 50 und dass der Übertrag stimmt, da ich da seit Tagen nicht weiterkomme und ich mir echt keinen Rat mehr weiß. Danke! :slight_smile:

wie soll denn die Anzahl der Stellen angegeben oder sonst irgendwie bestimmt werden?

Der Fehler sollte leicht zu finden sein. Einfach die schriftliche Addition Schritt für Schritt implementieren.

Da die Stellenanzahl in der Aufgabe nicht angegeben ist und ich ja Zufallswerte zuordnen will, kann ich das wie am besten machen?

Okay, ich versuche das mit der schrittweisen Implementierung. Aber ansonsten sollte der Code stimmen oder? Nur bei der Ausgabe am Ende mit der Methode ,ausgeben" bekomme ich einen Fehler angezeigt, außerdem wird gesagt, dass ich keine Main-Methode verwende -.-
Viele Fragen ich weiß, aber ich danke für die schnelle Hilfe! :slight_smile:

So wie Du die Ziffern zufällig bestimmst, kannst Du doch auch die Anzahl der Stellen zufällig bestimmen lassen?

Wie lautet der Fehler? Stimmt die Klammersetzung? Da Du den Code hier nicht eingerückt gepostet hast ist das schwer zu erkennen.

Ich hab auch noch eine Variante, in der der Übertrag noch komplett fehlt, da ich nicht weiß, wie ich den einbauen soll.


        int[] a = {4, 3, 2, 1};
        int[] b = {8, 7, 6, 5};
printArray(a);
        System.out.print("+");  printArray(b);
        System.out.println("----------------");

        add(a, b);

    }

    public static int[] add(int[] a, int[] b) {
        int[] result = new int[a.length];
        int sum = 0;

        for (int i = 0; i < a.length; i++) {
            if (a.length !=b.length){
            a[i+1]=b**+0;
            }
        if  (a** > 9) {
                sum += a** + b**;
                result**= (a** + b**)%10;

           } else {
              sum += a** + b**;
             result** = a** + b**;

            }
            

        }printArray(result);
        return result;
    }

    public static void printArray(int[] result) {
        if (result == null) {
            System.out.println("null ");
        } else {
            System.out.print("{");
            for (int i = 0; i < result.length; i++) {
                if (i > 0) {
                    System.out.print(", ");
                }
                System.out.print(result**);
            }
            System.out.println("}");
        }
//public static boolean testArrays(int[]a, int[]b){
//    return int [];
//}
// 1234
//+5678
//      2    
    }

}```   

Außerdem fehlt auch noch die Testmethode, siehe Kommentar. Wenn da jemand weiterhelfen kann, wäre super!

*** Edit ***

Der Fehler bei der Methode ausgeben heißt ,,incompatible taypes: java.lang.String cannot be converted to test.String"!

Da war die erste Variante der add Methode besser, bis auf den kleinen Fehler. Das erste if in der zweiten Variante bringt entweder nichts oder führt zu einem falschen Ergebnis. Bleib bei der anderen Variante, da ja a und b als gleich lang angenommen werden sollen - wie ich jetzt erst gelesen habe.

Hmm, okay. Aber bei mir funktioniert das Programm iwie gar nicht und den Fehler beim Übertrag hab ich immernoch nicht. Kannst du mir ihn vielleicht nennen, da ich die Aufgabe noch heute Abend abgeben muss und mich echt daran versucht habe, aber ich nach Stunden darüber Grübeln echt auf dem Schlauch stehe! Wäre echt super lieb! :slight_smile:

test.String

Wo kommt das denn her? Definierst Du irgendwo eine eigene klasse String?

[quote=InfoHeldin]Außerdem fehlt auch noch die Testmethode, siehe Kommentar. Wenn da jemand weiterhelfen kann, wäre super![/quote]Die Berechnung hast Du (sinnvoller Weise) in der Method add gekapselt. Damit kannst Du die main Methode als Testmethode nutzen. Dazu musst Du Dir nur klar machen, was die Aufgaben einer Testmethode sind:
[ol]
[li]definierte Vorbedingungen schaffen (z.B. Parameter erstellen)
[/li][li]zu testende Methode ausführen
[/li][li]Nachbedingungen prüfen (hier: stimmt das Ergebnis)
[/li][/ol]
Punkte eins und zwei macht Deine main-Methode schon, fehlt nur noch drei.

bye
TT

Wenn s die Summe ist. Berechnest Du sie falsch bzw nicht nach den Regeln der schriftlichen Addition und erhältst unter bestimmten Bedingungen einen falschen Übertrag.

Nein, ich habe keine Klasse String definiert :D, deshalb wundert mich der Ausdruck auch!

Danke, Timothy_Tuckle! Wenn ich den 3.Punkt noch mit unterbringe, ist die zweite Methode aus der Aufgabenstellung boolean testArrays (int[]a,int[]b) abgehandelt oder?:slight_smile:

*** Edit ***

Aber ich berechne die Summe doch durch den jeweiligen Zugriff auf die Indexwerte von a und b!?

*** Edit ***

Achja und wie kann ich die Stellenanzahl zufällig bestimmen? Macht das überhaupt Sinn?

und ignorierst den Übertrag

also muss ich dann noch den Übertrag dazu addieren?

Ist so üblich