2017-02-21 4 views
0

Ich habe vor einiger Zeit eine Frage über einen Algorithmus gestellt, der 6 Zeichen base36 Strings aus Integer-Zahlen generiert. Es hat die Einschränkung, dass das erste und letzte Zeichen immer ein Buchstabe sein muss und dass die ganze Zeichenfolge groß geschrieben wird. HierModifizierte Base36 zu Base 10 Algorithmus

ist der Algorithmus:

String getId(int id) 
{ 
    String s = ""; 
    for(int i = 0; i < 6; i++) 
    { 
     int digit; 
     if((i == 0) || (i == 5)) 
     { 
      digit = (id % 26) + 10;   
      id /= 26; 
     } 
     else 
     { 
      digit = id % 36; 
      id /= 36; 
     } 

     // add the digit to the string: 
     if(digit < 10) 
      s = (char)('0' + digit) + s; 
     else 
      s = (char)('A' + (digit - 10)) + s; 
    } 
    return s; 
} 

Ich versuche, ein Verfahren zu schaffen, die diese umkehrt. I.e. einen String gegeben wie A0000K es 10. Hier zurückkehren würde, ist, was ich bisher habe:

static int getNumber(String id) { 
    int base = 36; 
    int result = 0; 
    int n = id.length(); 
    for (int i = 0; i < id.length(); i++) 
    { 
     n-=1; 
     int digit = Character.digit(id.charAt(i), base);   

     if(i == 0 || i == 5) { 
      result += digit * (Math.pow(base-10, n)); 
     } 
     else { 
      result += digit * (Math.pow(base, n)); 
     } 

    } 

    return result; 
} 

Ich denke, die Frage um die if-Anweisung ist das Ergebnis für die Berechnung, aber ich bin mir nicht sicher, wie es zu berechnen. Ich basiere es von Standard-Algorithmen für die Umwandlung von anderen Basen zu Base 10.

Kann jemand helfen? Dank

+1

Die Basis ist anders für verschiedene Ziffern, können Sie nicht pow verwenden. Die kleinste signifikante Zahl ist n * 1, die zweite ist n * 26, die dritte ist n * 26 * 36. –

+1

Sorry, könnten Sie ein bisschen mehr Details liefern? Geht das nicht mit der if-Anweisung für die ersten und letzten Zeichen, die 10 von der Basis subtrahieren? – sam

+0

Math.pow (Basis, n) Was ist Basis, wenn Sie 26 * 36 brauchen? –

Antwort

0

ich so etwas tun würde, unter der Annahme, dass die Zeichenfolge 6 Zeichen lang ist zu vereinfachen:

static int getNumber(String id) { 
    int sum = 0, val; 
    char current; 
    for(int i = 0; i < 6; i++) { 
     current = id.charAt(i); 
     val = ((int) current) - (int) 'A'; 
     if(val > 0){ 
      sum += (val + 10) * Math.pow(36,5-i); 
     } else { 
      sum += ((int) id.charAt(i)) * Math.pow(36,5-i); 
     } 
    } 
    return sum; 
} 

ich es nicht getestet, aber es sollte funktionieren, oder zumindest sein ziemlich knapp. Wenn Sie weiterhin Schwierigkeiten haben, versuchen Sie es in einem Debugger zu durchlaufen.

0

Es wird einfacher sein, wenn Sie von der niedrigstwertigen zur wichtigsten Stelle iterieren, wobei Sie den Stellenwert jeder Ziffer/jeden Buchstaben verfolgen.

Überprüfen Sie, ob jedes Zeichen eine Ziffer oder ein Buchstabe ist, und konvertieren Sie es dann in einen Seitenwert. Ziffern sind 0-9, Buchstaben sind 10-35, außer in den 1. und 6. Platz, wo sie 10 weniger wert sind.

Multiplizieren Sie den Nennwert mit dem Wert place und fügen Sie ihn zum Ergebnis hinzu. Erhöhen Sie den Platzwert, indem Sie je nach Position entweder mit 26 oder 36 multiplizieren.

static int getNumber(String id) { 
    int placevalue = 1; 
    int result = 0; 
    for (int i = id.length()-1; i >= 0; i--) 
    { 
     int facevalue; 
     if(Character.isDigit(id.charAt(i))) 
      facevalue = (int)id.charAt(i) - '0'; 
     else 
      facevalue = ((int)id.charAt(i) - 'A') + 10; 

     if(i == 0 || i == 5) { 
      result += (facevalue - 10) * placevalue; 
      placevalue *= 26; 
     } 
     else { 
      result += facevalue * placevalue; 
      placevalue *= 36; 
     } 
    } 

    return result; 
} 

Das oben genannte führt keine Eingabeüberprüfung durch. Zumindest sollten Sie überprüfen, dass id.length ist 6.