【发布时间】:2017-04-17 07:27:41
【问题描述】:
我需要在给定的范围内为给定的数字基数(其大小应最大为 10,000)生成所有回文数。我需要一种有效的方法来做到这一点。
我偶然发现了this answer,它与base 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。
事实证明,我的其他代码会因为不断的转换而变慢,因为我需要按顺序和十进制的所有数字。我将坚持迭代每个整数并将其转换为每个基数,然后检查它是否为回文。
【问题讨论】:
-
Integer.parseInt有一个带有base参数的重载,可以将任何基数的字符串转换为整数,Integer.toString也是如此,您不必自己编写转换方法 -
@niceman Max radix= 36:如果我使用它,我无法转换为超过 36 的基数。如果该值低于最小基数或高于最大基数,则使用值 10。
-
嗯同意...