生成给定数字系统中的所有回文数字?

时间:2017-04-17 07:27:41

标签: java algorithm

我需要在给定范围内为给定数量的基数(应该能够达到10,000的大小)生成所有回文数。我需要一种有效的方法来做到这一点。

我偶然发现this answer,它直接与基地10有关。我试图让它适应所有"所有"碱:

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()方法使用数字列表将数字转换为给定基数中该数字的字符串表示。

convertBack()将数字的字符串表示形式转换回基数10。

当测试我的基础10的方法时,它会留下两位数的回文,然后它留下的下一个是1001,1111,1221 ......依此类推。

我不确定原因。

如果需要,以下是conversion methods

事实证明,由于我需要按顺序和十进制的所有数字进行常量转换,因此我的其他代码会变慢。我只是坚持迭代每个整数并将其转换为每个基数,然后检查它是否是回文。

2 个答案:

答案 0 :(得分:2)

我没有足够的声誉来发表评论,但如果你只缺少长度的回文,那么很可能你的名单有问题。很可能你忘了在列表中添加一个空条目来生成1001,它应该是num(10)+ empty(&#34;&#34;)+ rev(01)。

答案 1 :(得分:1)

在所有可能的基础中没有这么多适当的数字字符(如0xDEADBEEF表示十六进制,我认为convert有一些限制,如36),所以忘记异国数字,并使用简单的列表或数组,如[8888, 123, 5583],用于10000个基数的数字。

然后将限制转换为需要基数,存储它。 现在生成奇数和偶数长度的对称数组 [175, 2, 175][13, 221, 221, 13]。如果length与limit length相同,则比较数组值并拒绝过高的数字。

您也可以使用限制数组作为开始,并仅生成值较小的回文。