【问题标题】:Generate all Palindromic numbers in a given number system?在给定的数字系统中生成所有回文数?
【发布时间】: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。
  • 嗯同意...

标签: java algorithm


【解决方案1】:

我没有足够的声誉来发表评论,但如果您只缺少偶数长度的回文,那么您的列表很可能有问题。很可能您忘记在列表中添加一个空条目来生成 1001,它应该类似于 num(10) + empty("") + rev(01)。

【讨论】:

  • 原来如此,我现在明白了。但是 char[] 不能有空字符。我用 String[] 替换了我的 char[] 以包含“”,但我现在需要修复我的 convertBack 和 convert 方法。
  • @Vepir 如果您不想改变太多,那么您可以简单地明确处理这种情况。只需在遍历您的列表之前执行 str+revStr
【解决方案2】:

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

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

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

【讨论】:

  • Unicode (utf16) char 最多可以保存 65535 的值。但我不确定带有此类字符的输出是否可读
  • 我的建议是避免使用转换(文本输出除外)
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2016-02-09
  • 2011-04-08
相关资源
最近更新 更多