1 30 31 34 package com.nightlabs.math; 35 36 39 public class Base27CoderLowerCase 40 extends BaseNCoder 41 { 42 protected boolean skip0; 43 44 public Base27CoderLowerCase(boolean skip0) 45 { 46 this.skip0 = skip0; 47 48 char[] symbols = new char[27]; 49 symbols[0] = '0'; 50 char c = 'a'; 51 for (int i = 1; i < symbols.length; ++i) { 52 symbols[i] = c++; 53 } 54 55 init(symbols); 56 } 57 58 61 public String encode(long number, int minDigitCount) 62 { 63 if (skip0) { 64 int base = getBase(); 65 int period = base - 1; 66 67 long n = number; 68 long m = number + 1; 69 70 int digitIdx = 0; 71 while (n >= period) { 72 long divisor = (long)Math.pow(period, digitIdx + 1); 73 long f = n / divisor; 74 n = n - divisor; 75 m = m + (long)Math.pow(base, digitIdx) * f; 76 ++digitIdx; 77 } 78 number = m; 79 } 80 81 return super.encode(number, minDigitCount); 82 } 83 84 87 public long decode(String s) 88 { 89 long number = super.decode(s); 90 91 if (skip0) { 92 long a = 0; 94 long b = number; 95 long middle = b / 2; 96 long v = super.decode(encode(middle, 1)); 97 while (v != number) { 98 if (v > number) 99 b = middle; 100 else 101 a = middle; 102 103 middle = (b - a) / 2 + a; 104 105 v = super.decode(encode(middle, 1)); 106 } 107 108 number = middle; 109 } 110 111 return number; 112 } 113 114 public static void main(String [] args) 115 { 116 Base27CoderLowerCase b = new Base27CoderLowerCase(true); 117 118 for (int i = 0; i < 1000; ++i) { 119 System.out.print("" + i); 120 String s = b.encode(i, 3); 121 long m = b.decode(s); 122 String d; 124 if (s.startsWith("a")) 125 d = s.substring(1); 126 else 127 d = s; 128 129 if (d.length() > 0) { 130 StringBuffer sb = new StringBuffer (d); 131 for (int c = d.length() - 1; c >= 0; --c) { 132 if (d.charAt(c) == 'a') 133 sb.replace(c, c+1, "1"); 134 else 135 break; 136 } 137 d = sb.toString().replaceAll("[^1]", ""); 138 } 139 140 long back = b.decode(s); 142 System.out.println("\t" + s + "\t" + back + "\t" + (back - i) + "\t" + d); 143 } 146 } 147 } 148 | Popular Tags |