php 基于可用字母表并考虑最小字符串长度的数字字符串转换算法

aemubtdh  于 2023-01-19  发布在  PHP
关注(0)|答案(1)|浏览(148)

我试图弄清楚如何将一个数字转换成基于可用字母表的字符串,同时还要考虑最小字符串长度。
例如:
考虑到我有这个字母表:我定义了最小字符串长度为:2

The number 1 would be = AA
The number 2 would be = AB
The number 3 would be = A1
The number 4 would be = A2
The number 5 would be = BA
The number 6 would be = BB
The number 7 would be = B1
The number 8 would be = B2
The number 9 would be = 1A
The number 10 would be = 1B
...
if I run out of combinations, string length should increase:
The number 16 would be = 22
The number 17 would be = AAA
The number 18 would be = AAB
...

我怎样才能定义一个公式呢?(我会用PHP编程语言实现这个公式,但我猜这是数学对吗?我怎样才能创建一个'公式'呢?你能帮我吗?
它是否总是需要一次递归迭代?是否有一种方法可以快速得到结果?

    • 假设我的数字是400000或1000000,是否总是需要花费大量的迭代才能得到结果?是否有办法避免迭代/成本?**

编辑:
我喜欢@Stef的回答,非常非常有趣......它几乎是完美的!!!(实际上它可以为我工作!所以它实际上可以被称为完美)
但是...
我已经将base_convert结果与字母表、数据库seeder结果进行了比较,
下面是我输出的示例代码(如果有人感兴趣..)

for ($i = 0; $i < 1332; $i++){
    $alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';
    $totalAlphabetChars = strlen($alphabet);
    echo base_convert($i, 10, $totalAlphabetChars) . PHP_EOL;
}

我发现了一个不同之处!呵呵...
base_convert的组合少于36种(至少当字符串长度为2时,这种可能性/组合的损失很可能会随着字符串长度的增加而增加)
既然我们在这里,我认为这是值得问/分享的。
假设我想实现一些雄心勃勃的愿望。
检查以下差异:

使用我的递归函数/seeder,我可以得到考虑左边0的组合,但是base_convert没有给我考虑左边0的组合,对于我的完美世界来说是理想的,我想要最多的可能性,也考虑左边0.例如/meaning:

Line 37 should give me 00 instead of 10
Line 38 should give me 01 instead of 11
..
Line 72 should give me 0z instead of 1z

有没有一种方法可以用base_convert风格实现这一点?(没有迭代或递归函数,只是某种"即时"转换/结果,就像我们在这个问题/答案/编辑的当前状态下所拥有的那样?
另一个编辑:
在100.000中的可能性/组合的数量以下,一个使用递归函数(包括左侧的0):

而这个函数使用基于@Stef答案的base_convert(不包括左侧为零的组合/可能性)

我当然可以使用base_convert,并接受左侧为零的组合的丢失,但也有可能让它们成为我想要知道的^^
非常感谢!!

zf9nrax1

zf9nrax11#

您有一个包含k符号的字母表,并且您希望使n成为这些符号的不同组合。
k符号Map为数字0, 1, 2, ..., k-1,那么你的问题就像将一个数字重写为k一样简单。
在PHP中,可以使用函数base_convert将一个数字从基数10转换为基数k,然后使用函数strtr将基数k的标准数字替换为自定义符号。
要将400000转换为基本AB12

$s = base_convert("400000", 10, 4)
$s = strtr($s, "0123", "AB12")

echo $s

相关问题