我需要在给定范围内为给定数量的基数(应该能够达到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。
事实证明,由于我需要按顺序和十进制的所有数字进行常量转换,因此我的其他代码会变慢。我只是坚持迭代每个整数并将其转换为每个基数,然后检查它是否是回文。
答案 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相同,则比较数组值并拒绝过高的数字。
您也可以使用限制数组作为开始,并仅生成值较小的回文。