Mega Code Archive

 
Categories / Java / Data Type
 

Mixed Radix Number

//package aima.core.util.math; import java.util.List; /**  * @author Ciaran O'Reilly see:  *         http://demonstrations.wolfram.com/MixedRadixNumberRepresentations/  *         for useful example.  */ public class MixedRadixNumber extends Number {   //   private static final long serialVersionUID = 1L;   //   private long value = 0L;   private long maxValue = 0L;   private int[] radixs = null;   private int[] currentNumeralValue = null;   private boolean recalculate = true;   public MixedRadixNumber(long value, int[] radixs) {     this.value = value;     this.radixs = new int[radixs.length];     System.arraycopy(radixs, 0, this.radixs, 0, radixs.length);     calculateMaxValue();   }   public MixedRadixNumber(long value, List<Integer> radixs) {     this.value = value;     this.radixs = new int[radixs.size()];     for (int i = 0; i < radixs.size(); i++) {       this.radixs[i] = radixs.get(i);     }     calculateMaxValue();   }   public long getMaxAllowedValue() {     return maxValue;   }   public boolean increment() {     if (value < maxValue) {       value++;       recalculate = true;       return true;     }     return false;   }   public boolean decrement() {     if (value > 0) {       value--;       recalculate = true;       return true;     }     return false;   }   public int getCurrentNumeralValue(int atPosition) {     if (atPosition >= 0 && atPosition < radixs.length) {       if (recalculate) {         long quotient = value;         for (int i = 0; i < radixs.length; i++) {           if (0 != quotient) {             currentNumeralValue[i] = (int) quotient % radixs[i];             quotient = quotient / radixs[i];           } else {             currentNumeralValue[i] = 0;           }         }         recalculate = false;       }       return currentNumeralValue[atPosition];     }     throw new IllegalArgumentException(         "Argument atPosition must be >=0 and < " + radixs.length);   }   //   // START-Number   @Override   public int intValue() {     return (int) longValue();   }   @Override   public long longValue() {     return value;   }   @Override   public float floatValue() {     return longValue();   }   @Override   public double doubleValue() {     return longValue();   }   // END-Number   //   @Override   public String toString() {     StringBuilder sb = new StringBuilder();     for (int i = 0; i < radixs.length; i++) {       sb.append("[");       sb.append(this.getCurrentNumeralValue(i));       sb.append("]");     }     return sb.toString();   }   //   // PRIVATE   //   private void calculateMaxValue() {     if (0 == radixs.length) {       throw new IllegalArgumentException(           "At least 1 radix must be defined.");     }     for (int i = 0; i < radixs.length; i++) {       if (radixs[i] < 2) {         throw new IllegalArgumentException(             "Invalid radix, must be >= 2");       }     }     // Calcualte the maxValue allowed     maxValue = radixs[0];     for (int i = 1; i < radixs.length; i++) {       maxValue *= radixs[i];     }     maxValue -= 1;     if (value > maxValue) {       throw new IllegalArgumentException(           "The value ["               + value               + "] cannot be represented with the radixs provided, max value is "               + maxValue);     }     currentNumeralValue = new int[radixs.length];   } }