You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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进制:

  1. 调用进制转换("1A", 16, 2)
  2. 迭代过程:
    • 1A÷2 → 商D,余数0 → 结果0
    • D÷2 → 商6,余数1 → 结果10
    • 6÷2 → 商3,余数0 → 结果010
    • 3÷2 → 商1,余数1 → 结果1010
    • 1÷2 → 商``,余数1 → 结果11010
  3. 最终返回11010(对应十进制26,转换正确)

内容的提问来源于stack exchange,提问作者bchyou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:55:28