我已经广泛搜索了这个并且找不到任何东西。这是问题:将基数10转换为非常大的基数,例如基数400。
这样做的目的只是教育。
我知道没有足够的ASCII字符代表400个不同的数字'在基数400中,但是对于这个问题,高基数的每个位置值可以保留在基数10中。高基数的每个位值可以用空格(或句点)分隔以便于阅读。
基数400的示例:
372 0 105 50
基数500的示例:
492.0.256
基数1000的示例(这是基数1000中的5位数字):
854 685 353 498 123
非常感谢任何帮助。我们也欢迎您提供代表或分开数字的替代方法的建议。
答案 0 :(得分:1)
假设$number
为源编号而$base
为目标库,我们使用循环执行基本转换,其中每次迭代:
$number % $base
的其余部分。这会将当前数字的值返回为$digit
。$digit
中减去$number
。这将在稍后为我们提供圆润的分歧。$number
除以$base
。我们将计算提升到下一个数字。$digit
。$number
等于0
。示例:
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