将基数10转换为任意“模拟”数字。 PHP的高基数

时间:2015-10-02 15:01:42

标签: php base-conversion

我已经广泛搜索了这个并且找不到任何东西。这是问题:将基数10转换为非常大的基数,例如基数400。

这样做的目的只是教育。

我知道没有足够的ASCII字符代表400个不同的数字'在基数400中,但是对于这个问题,高基数的每个位置值可以保留在基数10中。高基数的每个位值可以用空格(或句点)分隔以便于阅读。

基数400的示例:

372 0 105 50

基数500的示例:

492.0.256

基数1000的示例(这是基数1000中的5位数字):

854 685 353 498 123

非常感谢任何帮助。我们也欢迎您提供代表或分开数字的替代方法的建议。

1 个答案:

答案 0 :(得分:1)

假设$number为源编号而$base为目标库,我们使用循环执行基本转换,其中每次迭代:

  1. 获取模$number % $base的其余部分。这会将当前数字的值返回为$digit
  2. $digit中减去$number。这将在稍后为我们提供圆润的分歧。
  3. $number除以$base。我们将计算提升到下一个数字。
  4. 我们存储$digit
  5. 返回第1步,直到$number等于0
  6. 示例:

    Step      1         2         3         4
          D=N%B     N=N-D     N=N/B         D
    -----------------------------------------
    512 in base 10 = 512
    -----------------------------------------
    512       2       510        51         2
     51       1        50         5         1
      5       5         0         0         5
    -----------------------------------------
    27 in base 2 = 11011
    -----------------------------------------
    27        1        26        13         1
    13        1        12         6         1
     6        0         6         3         0
     3        1         2         1         1
     1        1         0         0         1
    -----------------------------------------
    1234567 in base 400 = 7 286 167
    -----------------------------------------
    123456  167   1234400      3086       167
      3086  286      2800         7       286
         7    7         0         0         7
    

    此过程采用代码形式,使用BCMath Arbitrary Precision Mathematics

    // arguments must be strings
    function largeBaseConvert($num, $base) {
    
        $output = array();
    
        while($num !== '0') {
    
            // get remainder from modulo
            $digit = bcmod($num, $base);
    
            // substract remainder from number
            $num = bcsub($num, $digit);
    
            // divide by base
            $num = bcdiv($num, $base);
    
            // save
            $output[] = $digit;
        }
    
        // need to reverse the array as we count from the lowest digit
        return implode(' ', array_reverse($output));
    }
    

    测试:

    echo largeBaseConvert('1234567', '17');
    

    输出

    14 13 4 14 10
    

    检查:

    14 * 17^4 = 1169294
    13 * 17^3 =   63869
     4 * 17^2 =    1156
    14 * 17^1 =     238
    10 * 17^0 =      10
              = 1234567