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    }