Scratch中任意进制直接转换方案咨询(支持至36进制)
在Scratch中实现任意进制直接转换(2-36进制,无需十进制中转)
核心思路
直接进制转换的本质是基于基数的除法迭代:将源进制数反复除以目标基数,取余数作为目标进制的低位,直到商为空。由于Scratch对大数的支持有限,全程用字符串处理数字,避免数值精度丢失。
一、先实现基础字符-数值映射积木
36进制依赖0-9、A-Z的字符集,先做两个工具积木完成字符与数值的双向转换:
1. 字符转数值(字符)
用于将进制字符转为对应的十进制数值:
定义 字符转数值(字符) 将 字符 设为 转为大写(字符) 如果 字符 在 "0123456789" 中 那么 设 temp 为 字符的ASCII码 - 48 否则 设 temp 为 字符的ASCII码 - 65 + 10 返回 temp
2. 数值转字符(数值)
用于将十进制数值转为对应的进制字符:
定义 数值转字符(数值) 如果 数值 < 10 那么 返回 字符(数值 + 48) 否则 返回 字符(数值 - 10 + 65)
二、实现核心:字符串形式的源进制数 ÷ 目标基数
这是直接转换的关键——因为源数是字符串(避免大数溢出),需要模拟源进制下的除法运算,得到商(源进制字符串)和余数(十进制,即目标进制的一位):
除法运算(源数字符串, 源基数, 除数)
定义 除法运算(源数字符串, 源基数, 除数) 设 商字符串 为 "" 设 余数 为 0 设 索引i 为 1 重复执行直到 索引i > 源数字符串的长度 取 当前字符 为 源数字符串的第索引i位 设 temp 为 余数 * 源基数 + 字符转数值(当前字符) 设 当前商数字 为 temp // 除数 如果 当前商数字 ≠ 0 或者 商字符串 ≠ "" 那么 将 数值转字符(当前商数字) 加到 商字符串 的末尾 设 余数 为 temp % 除数 将 索引i 增加 1 返回 商字符串 和 余数
三、完整进制转换积木
整合上述工具,实现从源基数到目标基数的直接转换,包含错误校验:
进制转换(源数, 源基数, 目标基数)
定义 进制转换(源数, 源基数, 目标基数) // 校验基数合法性 如果 源基数 < 2 或者 源基数 > 36 或者 目标基数 < 2 或者 目标基数 > 36 那么 返回 "错误:基数必须在2-36之间" 将 源数 设为 转为大写(源数) // 处理特殊值0 如果 源数 = "0" 那么 返回 "0" // 校验源数字符合法性 设 索引i 为 1 重复执行直到 索引i > 源数的长度 设 当前数值 为 字符转数值(源数的第索引i位) 如果 当前数值 >= 源基数 那么 返回 "错误:源数包含非法字符" 将 索引i 增加 1 // 迭代除法转换 设 结果字符串 为 "" 设 当前源数 为 源数 重复执行直到 当前源数 = "" 调用 除法运算(当前源数, 源基数, 目标基数) 得到 商 和 余数 将 数值转字符(余数) 加到 结果字符串 的开头 设 当前源数 为 商 返回 结果字符串
四、使用示例
比如将16进制的1A转为2进制:
- 调用
进制转换("1A", 16, 2) - 迭代过程:
1A÷2 → 商D,余数0 → 结果0D÷2 → 商6,余数1 → 结果106÷2 → 商3,余数0 → 结果0103÷2 → 商1,余数1 → 结果10101÷2 → 商``,余数1 → 结果11010
- 最终返回
11010(对应十进制26,转换正确)
内容的提问来源于stack exchange,提问作者bchyou
相关产品推荐
相关产品推荐

