160 lines
5.0 KiB
Java
160 lines
5.0 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, 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)) {
|
|
return new GrosseZahl(0);
|
|
} else if(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, rueckgabe_b, operand, operand2;
|
|
rueckgabe_b = 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);
|
|
}
|
|
rueckgabe_b = rueckgabe_b.add(rueckgabe);
|
|
if(i != operand.zahl.length-1) {
|
|
rueckgabe_b = new GrosseZahl(rueckgabe_b.toString()+"0");
|
|
}
|
|
}
|
|
return rueckgabe_b;
|
|
}
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
}
|