2017-04-17 3 views
1

Ich muss alle palindromischen Zahlen für eine gegebene Zahlenbasis (die in der Lage sein sollte, bis zu 10.000 zu sein) in einem gegebenen Bereich erzeugen. Ich brauche einen effizienten Weg, es zu tun.Generieren Sie alle Palindromic-Zahlen in einem gegebenen Zahlensystem?

Ich stolperte über this answer, die direkt mit der Basis 10 verwandt ist. Ich versuche, es zu adaptieren für „alle“ Grundlagen zu arbeiten:

public static Set<String> allPalindromic(long limit, int base, char[] list) { 

    Set<String> result = new HashSet<String>(); 

    for (long i = 0; i <= base-1 && i <= limit; i++) { 
     result.add(convert(i, base, list)); 
    } 

    boolean cont = true; 
    for (long i = 1; cont; i++) { 
     StringBuffer rev = new StringBuffer("" + convert(i, base, list)).reverse(); 
     cont = false; 
     for (char d : list) { 
       String n = "" + convert(i, base, list) + d + rev; 
       if (convertBack(n, base, list) <= limit) { 
        cont = true; 
        result.add(n); 
       } 
     } 
    } 

    return result; 
} 

convert() Methode konvertiert eine Zahl in einer String-Darstellung dieser Zahl in einer gegebenen Basis eine Liste von Zeichen für Ziffern.

convertBack() wandelt die Zeichenfolgendarstellung einer Nummer 10.

Beim Testen meine Methode zum Boden 10, ist es auslässt zweistelliger Palindrome und auslässt dann die Nächsten zurück zur Basis sind 1001,1111,1221 ... und so weiter.

Ich bin mir nicht sicher warum.

Hier sind die conversion methods bei Bedarf.


Es stellt sich heraus, dies wird langsamer mit meinem anderen Code wegen der ständigen Umwandlungen, da ich die alle Zahlen in Ordnung und in dezimal muß. Ich bleibe einfach dabei, über jede Ganzzahl zu iterieren und sie in jede Basis zu konvertieren und dann zu überprüfen, ob es ein Palindrom ist.

+0

'Integer.parseInt' hat eine Überladung mit' base' Parameter, um eine Zeichenkette irgendeiner Basis in eine Ganzzahl zu konvertieren, also 'Integer.toString', Sie müssen keine Umrechnungsmethoden selbst schreiben – niceman

+0

@niceman [Max radix] (http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#MAX_RADIX) = 36: Ich kann nicht zu Basen über 36 konvertieren Wenn ich das benutze. Wenn der Wert unter Min Radix oder Max Radix liegt, wird stattdessen der Wert 10 verwendet. – Vepir

+0

hmmm einverstanden ... – niceman

Antwort

2

Ich habe nicht genug Reputation um zu kommentieren, aber wenn du nur lange Palindrome vermisst, dann ist höchstwahrscheinlich etwas mit deiner Liste nicht in Ordnung. Wahrscheinlich haben Sie vergessen, einen leeren Eintrag in der Liste hinzuzufügen, um 1001 zu generieren, es sollte wie num (10) + leer ("") + rev (01) sein.

+0

Das ist der Fall, ich sehe das jetzt. Aber char [] kann kein leeres Zeichen haben. Ich habe char [] durch String [] ersetzt, um "" einzufügen, aber ich muss jetzt meine convertBack- und Konvertierungsmethoden korrigieren. – Vepir

+0

@Vepir Wenn Sie nicht viel ändern möchten, dann können Sie diesen Fall einfach explizit behandeln. Tun Sie einfach str + revStr, bevor Sie Ihre Liste durchlaufen – krrish

+0

Es war einfach. Behandelte die Zeichenfolge [] in den Konvertierungen nur, da das erste Element ("") nicht vorhanden war. – Vepir

1

Es gibt keine so viele entsprechende Zeichen für die Ziffern in allen möglichen Basen (wie 0xDEADBEEF für hex, und ich nehme an, dass convert eine Grenze wie 36 hat), so etwa exotische Ziffern vergessen, und verwenden Sie einfache Listen oder Arrays wie [8888, 123, 5583] für Ziffern in 10000-Base.

Dann Limit in Basis zu konvertieren, speichern Sie es. Erzeugen Sie jetzt symmetrische Arrays mit ungerader und gerader Länge wie [175, 2, 175] oder [13, 221, 221, 13]. Wenn die Länge mit der Grenzlänge übereinstimmt, vergleichen Sie Array-Werte und weisen Sie zu hohe Werte zurück.

Sie können Limit Array auch als Start verwenden und nur Palindrome mit kleineren Werten generieren.

+0

Das Unicode-Zeichen (utf16) kann Werte bis 65535 enthalten.Aber ich bin nicht sicher, dass die Ausgabe mit solchen Zeichen lesbar sein wird – MBo

+0

Mein Vorschlag ist es, die Konvertierung zu vermeiden (mit Ausnahme der Textausgabe) – MBo

Verwandte Themen