首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算法中的错误

算法中的错误
EN

Stack Overflow用户
提问于 2011-02-01 23:55:58
回答 4查看 180关注 0票数 0

我有一个脚本:

代码语言:javascript
复制
function convert($src, $srcAlphabet = '0123456789', $dstAlphabet =
    'qwertyuiopasdfghjklzxcvbnm')
{
    $srcBase = strlen($srcAlphabet);
    $dstBase = strlen($dstAlphabet);

    $wet = $src;
    $val = 0;
    $mlt = 1;

    while($l = strlen($wet))
    {
        $digit = $wet[$l - 1];
        $val += $mlt * strpos($srcAlphabet, $digit);
        $wet = substr($wet, 0, $l - 1);
        $mlt *= $srcBase;
    }

    $wet = $val;
    $dst = '';

    while($wet >= $dstBase)
    {
        $digitVal = $wet % $dstBase;
        $digit = $dstAlphabet[$digitVal];
        $dst = $digit . $dst;
        $wet /= $dstBase;
    }

    $digit = $dstAlphabet[$wet];
    $dst = $digit . $dst;

    return $dst;
}

for($i = 0; $i < 10000; $i++)
{
    echo $i . ' = ' . convert(substr(' ' . $i, 1)) . '<br>';
}

它工作得很好,但是结果很奇怪...看起来是这样的:

代码语言:javascript
复制
0 = q
1 = w
2 = e
3 = r
4 = t
5 = y
6 = u
7 = i
8 = o
9 = p
10 = a
11 = s
12 = d
13 = f
14 = g
15 = h
16 = j
17 = k
18 = l
19 = z
20 = x
21 = c
22 = v
23 = b
24 = n
25 = m
26 = wq
...
...
676 = wqq
677 = wqw
678 = wqe
...

但是26应该是qq,676应该是qqq,677 = qwq,678 = qqe等等。

为什么从w而不是q开始(0除外)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-02 00:20:39

如果你改变了

代码语言:javascript
复制
$wet /= $dstBase;

代码语言:javascript
复制
$wet = $wet / $dstBase - 1;

您的代码将给出正确的结果。但是,正如Soren所指出的,使用PHP功能可以更轻松地完成任务。

票数 0
EN

Stack Overflow用户

发布于 2011-02-02 00:16:14

经过长时间的研究你的算法,我终于得到了你想要的^^

首先,PHP有很多内置的方法,对你有很大的帮助。如果我没记错的话,下面的代码只是将$src转换成一个整数。

代码语言:javascript
复制
while($l = strlen($wet))
{
    $digit = $wet[$l - 1];
    $val += $mlt * strpos($srcAlphabet, $digit);
    $wet = substr($wet, 0, $l - 1);
    $mlt *= $srcBase;
}

不仅在调用函数之前以一种奇怪的方式将其“转换”为字符串,而且还将其“转换”回一个更奇怪的整数。你应该看看php的intval方法。它总是以w开头的原因很简单,第二个循环只有在

代码语言:javascript
复制
$digitVal = $wet % $dstBase >= $dstBase

这意味着在下一步中,它仍然是$digitVal > 1,所以索引是最小的1,这对应于w。实际上,这在某种程度上是有意义的,即使我不知道你到底想要完成什么(将你的数字的基数改为26?),因为0也存在,但是没有像009这样的数字或类似的数字。然后您只需编写9,在您的系统中也是如此(您只需编写p而不是qqp)。

然而,你真的应该在PHP中学习一些技巧,让你的生活变得更容易。请看一下this教程。

票数 2
EN

Stack Overflow用户

发布于 2011-02-02 00:18:45

q代表0。很明显,您找到的脚本执行了基本转换。为了区分0和26,它需要以不同的方式表示值。

因为q已经是0,所以它不能对26使用qq,因为这等同于00。它需要第一个字母来表示1,所以它使用wq

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4864778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档