freeCodeCamp 每日编程挑战精解:用 Python 实现十进制转二进制(Challenge 53)
发布时间:2026/9/10 16:32:59 作者:尧图编辑部 阅读量:1,286
)
freeCodeCamp 每日编程挑战精解用 Python 实现十进制转二进制Challenge 53【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇文章以 freeCodeCamp 开源仓库中curriculum/challenges/english/blocks/daily-coding-challenges-python/68b7cadffed0e75a517da675.md这份 Python 每日编程挑战Challenge 53Decimal to Binary为讲解核心完整拆解题目定义、短除法算法原理、测试用例、种子代码与官方参考解法并在此基础上结合仓库中每日挑战的 API 路由、数据库 Schema 校验与前端渲染代码说明这道题在 freeCodeCamp 每日挑战体系中的完整流转链路。读完本文你既能独立实现并通过to_binary的全部测试也能理解这道题从 Markdown 课程文件到真实在线练习的工程化落地方式。一、挑战概览题目到底在问什么Challenge 53 位于仓库curriculum/challenges/english/blocks/daily-coding-challenges-python/目录下是 freeCodeCamp Python 每日编程挑战序列daily-coding-challenges-python中的一道题。原文档的题目描述非常精炼Given a non-negative integer, return its binary representation as a string.即给定一个非负整数返回其二进制表示以字符串形式。需要实现的函数签名为to_binary(decimal)参数名decimal表明输入是一个十进制整数。几个值得注意的约束与要求输入是非负整数non-negative integer意味着0也是合法输入这是后面解法必须处理的边界情况返回值是字符串as a string例如12要返回1100而非数字1100不允许借助bin()之类的现成内置函数完成转换——题目只给出to_binary这一空壳函数需要自行实现算法逻辑。二、核心算法短除法repeated division by 2原文档用一组数学算式清晰演示了十进制转二进制的基本原理二进制数只用0和1两个数字表示任何数转换的核心操作是反复将数除以2并记录余数直到数变为0然后从最后记录的余数倒序读取。以12为例原文档给出了完整的推导过程12 ÷ 2 6 remainder 0 6 ÷ 2 3 remainder 0 3 ÷ 2 1 remainder 1 1 ÷ 2 0 remainder 1将余数**自下而上last recorded to first**排列得到1100所以12的二进制表示就是1100。这个方法在算法领域通常被称为短除法repeated division或除 2 取余法其正确性依据是整数除法定理对任意非负整数n可唯一写成n 2 × q r其中q是商、r ∈ {0, 1}是余数r恰好就是二进制表示的最低位而q继续迭代直到商为0为止。整个过程收集到的余数序列从最后一次除法的余数向第一次除法的余数反向排列即为最终二进制字符串。三、测试用例与验收标准原文档通过--hints--段给出了 4 个必须通过的验收测试。这些测试不是简单的人肉对拍而是以runPythonunittest.TestCase的形式内嵌在挑战中运行时会真正执行学习者提交的 Python 函数测试调用期望返回值说明to_binary(5)1015 4 1二进制101to_binary(12)1100原文档中的推导示例to_binary(50)11001050 32 16 2to_binary(99)110001199 64 32 2 1以第一个测试为例其实际执行代码为from unittest import TestCase TestCase().assertEqual(to_binary(5), 101)这意味着函数必须精确返回字符串101如果返回整数101、返回5或任何格式差异断言都会失败。从测试值的选取上看5、12、50、99覆盖了不同位长3 位、4 位、6 位、7 位和不同的位模式可以较好地验证实现的通用性不过它们都大于0因此0这个边界输入需要学习者在解题时自己意识到。四、种子代码与参考解法逐行拆解4.1 种子代码起点原文档--seed-contents--给出的初始代码如下def to_binary(decimal): return decimal种子函数只是占位实现接收decimal后原样返回。学习者需要做的就是把return decimal替换为真正的二进制转换逻辑。注意种子代码中return decimal直接返回的是数字即便不转换前两个 hint 中的字符串断言也一定会失败——这保证了必须真正改写函数体才能通过测试。4.2 官方参考解法原文档--solutions--给出了官方参考实现这里逐行展开讲解def to_binary(decimal): if decimal 0: return 0 binary while decimal 0: binary str(decimal % 2) binary decimal // 2 return binary第 2–3 行零值特判if decimal 0: return 0。根据题目非负整数的约束0是合法输入。若不加特判while decimal 0循环体一次都不会执行函数会返回空字符串这显然不是0的二进制表示。因此必须先处理0这也是为什么官方解法在循环前单独判断。第 4 行结果初始化binary 用一个空字符串累积结果。第 5–7 行迭代主体while decimal 0:循环内部执行两步操作str(decimal % 2)取当前数除以2的余数并转成字符。decimal % 2的结果只会是0或1这恰好对应二进制位binary str(decimal % 2) binary将新余数拼接到字符串最前面。这一点是倒序读取余数的直接实现最先算出的余数是二进制的最低位放在最右最后算出的余数是最高位放在最左把每次新得到的余数插到字符串头部正好完成反转无需在循环结束后再reverse。decimal // 2使用整数整除//更新被除数丢弃小数部分进入下一轮迭代。第 8 行返回结果循环终止decimal变为0后返回累积的二进制字符串。以to_binary(5)为例手动追踪5 % 2 1→binary 15 // 2 22 % 2 0→binary 012 // 2 11 % 2 1→binary 1011 // 2 0循环结束返回101与 hint 完全一致。4.3 正确性论证与可选的等价实现该解法的正确性可以从两方面论证终止性每轮迭代decimal经// 2严格减半非负整数必然在有限步内到达0循环一定终止正确性按除 2 取余、余数倒排的过程产生的位串与短除法推导完全一致原文档12 → 1100的推导即为该算法的等价手工演示。从学习角度还可以思考一些等价的实现方式均不依赖bin()# 等价写法一先收集余数再反转 def to_binary(decimal): if decimal 0: return 0 remainders [] while decimal 0: remainders.append(str(decimal % 2)) decimal // 2 return .join(reversed(remainders)) # 等价写法二递归实现 def to_binary(decimal): if decimal 0: return 0 def helper(n): if n 0: return return helper(n // 2) str(n % 2) return helper(decimal)两种写法都能通过同样的 hint 测试说明算法思想 字符串拼接策略是本题的关键具体写法可以灵活。五、从课程到生产这道题在 freeCodeCamp 中的完整链路Challenge 53 不只是仓库里的一个静态 Markdown 文件它是 freeCodeCamp **每日编程挑战Daily Coding Challenge**功能的一部分。理解这道题的工程上下文有助于更全面地把握它在项目中的位置。5.1 挑战文件的字段结构该文件本身遵循 freeCodeCamp 挑战 Markdown 的标准 frontmatter 约定--- id: 68b7cadffed0e75a517da675 title: Challenge 53: Decimal to Binary challengeType: 29 dashedName: challenge-53 ---其中challengeType: 29是关键字段。在前端渲染代码 show-daily-coding-challenge.tsx 中可以看到challengeType为28时按 JavaScript 挑战渲染29时按 Python 挑战渲染并分别把挑战文件映射为script.jsfileKeyscriptjs与main.pyfileKeymainpy供多文件编辑器使用。文档主体则划分为四个标准区块# --description--题目描述即本挑战的转换要求与示例# --hints--可执行的验收测试内嵌runPythonunittest.TestCase断言# --seed--学习者看到的种子代码# --solutions--官方参考解法供学习者对照。5.2 挑战数据如何被消费与校验前端页面加载某一天的挑战时会向 API 发起请求并校验响应数据。在 daily-coding-challenge-validator.ts 中使用 Joi 定义了严格的响应 Schema每个语言分支必须包含teststext与testString字符串数组和challengeFilesfileKey与contents字符串数组顶层必须包含id、challengeNumber≥ 1 的整数、title、date、description以及javascript、python两套完整数据。Challenge 53 的--hints--测试与--seed--challengeFiles 内容正是通过这套结构进入在线编辑器的。5.3 双语言配对与每日挑战种子数据值得补充的是每日挑战同时提供 JavaScript 与 Python 两个版本同一挑战号对应一对 JS/Python 挑战文件。在种子工具 tools/daily-challenges/helpers.ts 的combineChallenges函数中可以看到系统会按challengeNumber把 JS 与 Python 挑战合并为一条数据库记录并强制校验两者的title、description完全一致tests数量一致合并后的记录包含javascript与python两套testschallengeFiles标题会去掉Challenge {n}:前缀。Challenge 53 这类 Python 挑战文件正是通过该流程与对应的 JavaScript 版本配对最终落库供 API 查询。5.4 后端 API 与按天查询合并后的挑战记录存储在数据库中通过 API 暴露。在 daily-coding-challenge.ts 中定义了多个公开的 GET 路由其中前端页面实际使用的是按MM-DD查询的/daily-coding-challenge/day/:day路由此外还有/date/:date、/today、/month/:month、/all、/newest等变体。路由会调用 Prisma 查询dailyCodingChallenges表并把challenge.date序列化为 ISO 字符串后返回。与之配套的参数校验定义在 schemas/daily-coding-challenge.tsday参数必须匹配^\d{2}-\d{2}$模式date参数必须是YYYY-MM-DD格式响应体的字段id、date、challengeNumber、title、description、javascript、python也在此处做了类型约束。5.5 前端渲染与语言切换数据到达前端后ShowDailyCodingChallenge组件会先调用isValidDateOrMonthDayString校验日期格式相关工具函数在 client/src/components/daily-coding-challenge/helpers.ts再向 API 发起请求随后把响应数据格式化成ShowClassic经典挑战组件所需的 props如superBlock: daily-coding-challenge、helpCategory: Python、challengeType: 29。用户还可以通过localStorage中dailyCodingChallengeLanguage键在 JavaScript 与 Python 之间切换语言。也就是说学习者今天在 freeCodeCamp 上看到的 Challenge 53Decimal to Binary本质上是本文这份 Markdown 文件 → 种子脚本合并入库 → API 按日期查询 → 前端 Schema 校验 → 多文件编辑器渲染整条流水线的最终呈现。六、小结Challenge 53Decimal to Binary虽然是一道基础算法题但它承载的知识点非常完整短除法的数学原理、字符串拼接的顺序敏感性、0值边界处理、以及输入约束—验收测试—参考解法的标准课程工程结构。对照官方解法binary str(decimal % 2) binary这一行的拼接方向是整个实现的精髓也是初学者最容易写反的地方。若想继续深入可以在仓库中查阅以下文件本挑战原始文档curriculum/challenges/english/blocks/daily-coding-challenges-python/68b7cadffed0e75a517da675.md以及同一区块下的其他每日挑战如6814d8e1516e86b171929de4.md的 Vowel Balance 题每日挑战 API 路由实现api/src/daily-coding-challenge/routes/daily-coding-challenge.ts响应 Schema 定义api/src/daily-coding-challenge/schemas/daily-coding-challenge.ts前端数据校验client/src/utils/daily-coding-challenge-validator.ts前端挑战页面渲染client/src/client-only-routes/show-daily-coding-challenge.tsx每日挑战种子合并逻辑tools/daily-challenges/helpers.ts。理解了算法本身与它在 freeCodeCamp 工程体系中的位置你既能轻松写出to_binary并通过全部测试也能读懂每日挑战从课程文件到在线练习的完整技术实现。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考