001 package de.hska.java.aufgaben.interfaces;
002
003 /**
004 * Eine Implementierung von Dezimalzahl mit einem Feld.
005 * Jedes Feldelement repräsentiert eine Ziffer der Dezimalzahl.
006 * Die Dezimalzahlen dürfen nicht negativ werden.
007 *
008 * <p>
009 * <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/interfaces.html#dezimalzahl">Zurück zum Aufgabentext</a>
010 * </p>
011 *
012 *
013 * @author Christian Pape
014 *
015 */
016 public class DezimalzahlArray implements Dezimalzahl {
017
018 private byte [] ziffern = new byte[1000];
019
020 /**
021 * Zeigt auf die Ziffer mit der höchsten Wertigkeit
022 */
023 private int letzteZiffer = 0;
024
025 /**
026 * Erzeugt eine neue Dezimalzahl identisch zum
027 * gegebenen long-Wert.
028 * @param zahl eine positive Zahl
029 */
030 public DezimalzahlArray(long zahl) {
031 if (zahl > 0) {
032 while (zahl > 0) {
033 ziffern[letzteZiffer++] = (byte) (zahl % 10);
034 zahl /= 10;
035 }
036 letzteZiffer--;
037 }
038 }
039
040 /**
041 * Addiert zwei Dezimalzahlen und gibt die
042 * Summe als neue Dezimalzahl zurück.
043 * Zeitaufwand O(n) mit n Anzahl Dezimalstellen der größten der
044 * zu addierenden Zahlen.
045 */
046 public Dezimalzahl addieren(Dezimalzahl zahl) {
047 DezimalzahlArray summe = new DezimalzahlArray(0);
048 summe.letzteZiffer = Math.max(this.letzteZiffer, zahl.getAnzahlZiffern());
049 int uebertrag = 0; // int statt byte, um casts zu sparen
050
051 for (int i = 0; i <= letzteZiffer; i++) {
052 int summenZiffer = (ziffern[i] + zahl.getZiffer(i) + uebertrag);
053 uebertrag = (summenZiffer / 10);
054 summe.ziffern[i] = (byte) (summenZiffer % 10);
055 }
056
057 if (uebertrag == 1) {
058 letzteZiffer++;
059 summe.ziffern[summe.letzteZiffer] = 1;
060 }
061
062 return summe;
063 }
064
065 public double getDouble() {
066 double zahl = 0.0;
067
068 for (int i = letzteZiffer; i >= 0; i--) {
069 zahl = 10 * zahl + ziffern[i];
070 }
071
072 return zahl;
073 }
074
075 /**
076 * Multipliziert zwei Dezimalzahlen und gibt das Produkt
077 * als neue Dezimalzahl zurück.
078 * Der Zeitaufwand ist O(n * m) mit n und m die Anzahl der
079 * Dezimalstellen der beiden Zahlen.
080 */
081 public Dezimalzahl multiplizieren(Dezimalzahl zahl) {
082 DezimalzahlArray produkt = new DezimalzahlArray(0);
083
084 for (int i = letzteZiffer; i >= 0; i--) {
085 for (int j = zahl.getAnzahlZiffern() - 1; j >= 0; j--) {
086 byte produktZiffern = (byte) (ziffern[i] * zahl.getZiffer(j));
087 produkt.ziffern[i + j] += produktZiffern % 10;
088 if (i + j > 0) {
089 produkt.ziffern[i + j - 1] += (produktZiffern / 10 ) % 10;
090 }
091 }
092 }
093
094 produkt.letzteZiffer = letzteZiffer + zahl.getAnzahlZiffern() - 1;
095 while (produkt.ziffern[produkt.letzteZiffer] == 0) {
096 produkt.letzteZiffer--;
097 }
098
099 return produkt;
100 }
101
102 public String toString() {
103 StringBuffer stringBuffer = new StringBuffer();
104
105 for (int i = 0; i <= letzteZiffer; i++) {
106 stringBuffer.append(ziffern[i]);
107 }
108
109 return stringBuffer.reverse().toString();
110 }
111
112 public byte getZiffer(int i) {
113 return ziffern[i];
114 }
115
116 public int getAnzahlZiffern() {
117 return letzteZiffer + 1;
118 }
119
120 }