Additionsmethode testen < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 12:55 Do 06.12.2012 | Autor: | imzadi |
Guten Tag.
Ich schreibe eine Klasse (BigInt),sowas wie BigInteger und bin soweit dass schonmal 2 integers addieren kann. Ich muß aber meine Implementation testen indem ich die Zahlen von 1 bis 100 addiere. Und das klappt bei mir nicht , vielleicht hat jemand ein Rat für mich. Ich poste hier meine Additionsmethode:
import java.util.Scanner;
public class BigInt{
private byte[] digits;
// Get- und Set-Methoden ,Konstruktoren,equal- und toString-Methoden
public BigInt add(BigInt addend){
byte[] sum = new byte[Math.max(this.digits.length,addend.getDigits().length)+1];
BigInt sum1 = new BigInt(sum);
int s = 0;
if (addend.getDigits().length < this.digits.length){
s = addend.getDigits().length;
}
else if (addend.getDigits().length > this.digits.length){
s = this.digits.length;
}
else{
s = this.digits.length;
}
for(int i=0;i<s; i++){
sum1.getDigits()[i] += (byte)(addend.getDigits()[i] + this.getDigits()[i]);
if (sum1.getDigits()[i] > 9){
sum1.getDigits()[i] -= 10;
sum1.getDigits()[i+1] += 1;
}
}
if (addend.getDigits().length < this.digits.length){
for (int j = s; j < this.digits.length; j++){
sum1.getDigits()[j] += this.getDigits()[j];
}
}
else if(addend.getDigits().length > this.digits.length){
for (int j = s; j < addend.getDigits().length; j++){
sum1.getDigits()[j] += addend.getDigits()[j];
}
}
return sum1 ;
}
Und der Test dazu:
public static void main(String[] args) {
BigInt sum = new BigInt(188888);
BigInt sum1 = new BigInt(100000);
}
System.out.println(sum1.add(sum));
}
Vielen Dank
Ich habe diese Frage in keinen anderen Foren auf anderen Seiten gepostet.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 13:46 Do 06.12.2012 | Autor: | felixf |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Moin!
> Ich schreibe eine Klasse (BigInt),sowas wie BigInteger und
> bin soweit dass schonmal 2 integers addieren kann. Ich muß
> aber meine Implementation testen indem ich die Zahlen von 1
> bis 100 addiere. Und das klappt bei mir nicht , vielleicht
> hat jemand ein Rat für mich. Ich poste hier meine
> Additionsmethode:
>
>
> import java.util.Scanner;
>
> public class BigInt{
> private byte[] digits;
So wie ich das verstehe speicherst du hier die Dezimalziffern der Zahl?
Und du arbeitest nur mit nicht-negativen ganzen Zahlen?
> // Get- und Set-Methoden ,Konstruktoren,equal- und
> toString-Methoden
>
>
> public BigInt add(BigInt addend){
> byte[] sum = new
> byte[Math.max(this.digits.length,addend.getDigits().length)+1];
Ein Tipp dazu: du solltest ab und an das Array verkuerzen, ansonsten blaest du das immer mehr auf.
> BigInt sum1 = new BigInt(sum);
Ich vermute mal, der Konstruktor initialisiert digits mit sum und tut sonst nichts?
> int s = 0;
>
>
> if (addend.getDigits().length < this.digits.length){
> s = addend.getDigits().length;
> }
> else if (addend.getDigits().length >
> this.digits.length){
> s = this.digits.length;
> }
> else{
> s = this.digits.length;
> }
Das kannst du noch ein wenig verkuerzen. Der letzte else-Zweig ist ueberfluessig, wenn du beim else if das ">" durch ">=" ersetzt.
> for(int i=0;i<s; i++){
> sum1.getDigits() += (byte)(addend.getDigits() +
> this.getDigits());
Warum der cast?
> if (sum1.getDigits() > 9){
>
> sum1.getDigits() -= 10;
> sum1.getDigits()[i+1] += 1;
> }
> }
>
> if (addend.getDigits().length < this.digits.length){
> for (int j = s; j < this.digits.length; j++){
> sum1.getDigits()[j] += this.getDigits()[j];
> }
> }
> else if(addend.getDigits().length >
> this.digits.length){
> for (int j = s; j < addend.getDigits().length; j++){
> sum1.getDigits()[j] += addend.getDigits()[j];
> }
> }
Hier ignorierst du jeweils den Fall, dass du ein Carry vom Index s-1 haben kannst (weil sum1.getDigits()[s-1] > 9 war). Damit kannes vorkommen, dass sum1.getDigits()[s] == 10Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
ist.
>
> return sum1 ;
> }
>
> Und der Test dazu:
>
> public static void main(String[] args) {
>
> BigInt sum = new BigInt(188888);
> BigInt sum1 = new BigInt(100000);
> }
> System.out.println(sum1.add(sum));
Was ist denn die Ausgabe hier? Warum ist sie falsch?
Dieser Testcase sollte eigentlich funktionieren, soweit man das von dem Fragment oben erkennen kann.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:58 Do 06.12.2012 | Autor: | imzadi |
Also die Ausgabe ich ja richtig, ich komme aber nicht drauf wie ich mit der Methode die Zahlen z.B.
von 1 bis 100 addieren kann. Danke schön.
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 16:05 Do 06.12.2012 | Autor: | imzadi |
Liebes Forum,
Ich habe irgendwie heute ein Problem nach dem anderm: die Multiplikationsmethode zu dem obengenannten Programm will auch nicht funktionieren! Vielleicht kann jemand auf die Sprünge helfen,vielen vielen Dank
public BigInt multiply(BigInt factor){
BigInt multi = new BigInt(this.getDigits());
BigInt konstantMulti = new BigInt(this.getDigits());
int k = factor.getDigits().length - 1;
int i = factor.getDigits()[factor.getDigits().length - 1];
for (int j = 0 ; j <= Math.pow(10,k) * i ; j++){
multi = multi.add(konstantMulti);
}
return multi;
}
public static void main(String[]args){
BigInt sum1 = new BigInt(5);
BigInt sum = new BigInt(8);
System.out.println( sum1.multiply(sum) );
}
Finde den Fehler nich und kommt 60 raus,vielen dank fuer eure Tipps .
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:20 Sa 08.12.2012 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 15:19 Sa 08.12.2012 | Autor: | imzadi |
Hallo,
Ich bekomme bei der Ausgabe führende Nullen , die müssen weg. Kann das was mit meinen Konstruktoren zu tun haben? Ich poste meine Konstruktoren , vielleicht hat jemand eine Idee. Es bezieht sich wie gesagt auf die Additionsmethode von vorhin, die funktioniert für alle Zahlen mittlerweile einwandfrei . Wie gesagt, wäre super, wenn jemand mir einen Tipp geben könnte: ich bin ein absoluter Anfänger und verstehe noch nicht ganz was diese ganze viele Nullen mit dem Konstruktor zu tun haben können . Vielen Dank für Eure Hilfe.
// 1. Konstruktor erstellt ein BigInt, das die Zahl 0 representiert
public BigInt() {
this.digits = new byte [0];
}
// 2. Konstruktor erhält ein long als Input und erstellt ein BigInt,das die übergebene Zahl repra ̈sentiert.
public BigInt (long input) {
String sInput = input + "";
this. digits = new byte [sInput.length()];
for ( int i = 0; I < sInput.length(); i++);
char c = sInput.charAt(sInput.length()-1-i);
this.digits[i] = (byte)((int)-48);
}
// 3. Konstruktor erhält ein Array von Bytes das in die interne Datenstruktur kopiert werden soll.
public BigInt ( byte [] newDigits) {
this.setDigits(newDigits);
}
Wie gesagt,könnte vielleicht jemand drüber schauen und mir einen Tipp geben,was diese geheimnisvolle Konstruktoren mit führenden Nullen zu tun haben können, vielen Dank für eure Hilfe.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:20 Mo 10.12.2012 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|