Java_2/src/main/java/de/joethei/hs/java2/praktikum/praktikum1/GrosseZahl.java

170 lines
5.2 KiB
Java

package de.joethei.hs.java2.praktikum.praktikum1;
public class GrosseZahl {
private int[] zahl;
public GrosseZahl(String d) {
Boolean korrekteEingabe=true;
for(int i=0; i<d.length(); i++) {
if(d.charAt(i) < '0' || d.charAt(i) > '9') {
korrekteEingabe = false;
}
}
if(korrekteEingabe) {
zahl = new int[d.length()];
for(int w=0; w<d.length(); w++) {
zahl[w] = Integer.parseInt(String.valueOf(d.charAt(w)));
}
} else {
throw new IllegalArgumentException("falscher Input");
}
}
public GrosseZahl(int i) {
this(Integer.toString(i));
}
public boolean less(GrosseZahl b) {
if(this.zahl.length < b.zahl.length) return true;
if(this.zahl.length > b.zahl.length) return false;
for(int i = 0; i<this.zahl.length; i++) {
if(this.zahl[i] > b.zahl[i]) return false;
if(this.zahl[i] < b.zahl[i]) return true;
}
return false;
}
public GrosseZahl add(GrosseZahl b) {
int uebertrag = 0;
GrosseZahl rueckgabe;
GrosseZahl operand;
if(this.less(b)) {
rueckgabe = new GrosseZahl(b.toString());
operand = new GrosseZahl(this.toString());
} else {
rueckgabe = new GrosseZahl(this.toString());
operand = new GrosseZahl(b.toString());
}
for(int i = (rueckgabe.zahl.length-1), w = (operand.zahl.length-1); i>=0; i--, w--) {
rueckgabe.zahl[i] += uebertrag;
uebertrag = 0;
if(w>=0) {
rueckgabe.zahl[i] += operand.zahl[w];
}
if(rueckgabe.zahl[i] > 9) {
rueckgabe.zahl[i] -= 10;
uebertrag = 1;
}
if(i==0 && uebertrag==1) {
return new GrosseZahl("1"+rueckgabe.toString());
}
}
return rueckgabe;
}
public GrosseZahl sub(GrosseZahl b) {
int uebertrag = 0;
StringBuilder x;
if(this.equals(b) || this.less(b)) {
return new GrosseZahl(0);
}
GrosseZahl rueckgabe = new GrosseZahl(this.toString());
GrosseZahl operand = new GrosseZahl(b.toString());
for(int i = (rueckgabe.zahl.length-1), w = (operand.zahl.length-1); i>=0; i--, w--) {
if(w>=0) {
rueckgabe.zahl[i] -= operand.zahl[w];
}
rueckgabe.zahl[i] -= uebertrag;
uebertrag = 0;
if(rueckgabe.zahl[i] < 0) {
rueckgabe.zahl[i] += 10;
uebertrag += 1;
}
}
while(rueckgabe.zahl[0] == 0) {
x = new StringBuilder();
for(int i = 1; i<rueckgabe.zahl.length; i++) {
x.append(rueckgabe.zahl[i]);
}
rueckgabe = new GrosseZahl(x.toString());
}
return rueckgabe;
}
public GrosseZahl mult(GrosseZahl b) {
GrosseZahl rueckgabe;
GrosseZahl result;
GrosseZahl operand;
GrosseZahl operand2;
result = new GrosseZahl(0);
if(this.less(b)) {
operand2 = b;
operand = this;
} else {
operand2 = this;
operand = b;
}
for(int i = 0; i<operand.zahl.length; i++) {
rueckgabe = new GrosseZahl(0);
for(int w = 0; w<operand.zahl[i]; w++) {
rueckgabe = rueckgabe.add(operand2);
}
result = result.add(rueckgabe);
if(i != operand.zahl.length-1) {
result = new GrosseZahl(result.toString()+"0");
}
}
return result;
}
public int length() {
return zahl.length;
}
public int numberAt(int i) {
return zahl[i];
}
public GrosseZahl ggT(GrosseZahl b) {
GrosseZahl operand1 = new GrosseZahl(this.toString());
GrosseZahl operand2 = new GrosseZahl(b.toString());
if(operand1.equals(operand2)) return operand1;
else if(operand1.less(operand2)) return operand1.ggT(operand2.sub(operand1));
else return operand1.sub(operand2).ggT(operand2);
}
@Override
public String toString() {
StringBuilder rueckgabe = new StringBuilder();
for (int aZahl : zahl) {
rueckgabe.append(Integer.toString(aZahl));
}
return rueckgabe.toString();
}
@Override
public boolean equals(Object o) {
if(o instanceof GrosseZahl) {
GrosseZahl tmp = (GrosseZahl) o;
if(tmp.zahl.length == this.zahl.length) {
for(int i = this.zahl.length - 1; i >= 0; i--) {
if(tmp.zahl[i] != this.zahl[i]) return false;
}
return true;
}else return false;
}
return false;
}
@Override
public int hashCode() {
int result = 0;
for(int i : zahl) {
result += i;
}
return result * zahl.length;
}
}