力扣面试题 - 25 二进制数转字符串

题目:

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印"ERROR"。

示例1:

复制代码
 输入:0.625
 输出:"0.101"

示例2:

复制代码
 输入:0.1
 输出:"ERROR"
 提示:0.1无法被二进制准确表示

提示:

  • 32位包括输出中的 "0." 这两位。
  • 题目保证输入用例的小数位数最多只有 6

思路:

  1. 首先需要知道小数点是如何转二进制的(乘2取整),不了解的同学可以看看这篇博客。小数的二进制表示-CSDN博客
  2. 那这道题应该怎么做呢?我们可以先定义一个字符数组用来存储结果。然后将num乘2,如果大于1,那么结果数组写入1,否则写入0。同时需要记录长度。
  3. 如果该数能被准确表示,那么他最后的小数部分最后会变为0。否则则是不能被准确表示。
  4. 同时,如果长度大于了32,那么他也算不能准确表示。
  5. 所有都判断完后,那么返回结果字符串,得解。

C代码如下:

cpp 复制代码
char* printBin(double num) {
    // 检查输入是否合法
    if (num <= 0 || num >= 1) {
        return "ERROR";
    }

    // 用于存储结果的静态字符数组
    static char result[34]; // 最多 32 位 + '\0'
    strcpy(result, "0.");   // 初始化为 "0."

    // 转换逻辑
    int length = 2; // 当前长度,包含 "0."
    while (num > 0) {
        // 如果长度超过 32 位,则返回 ERROR
        if (length >= 32) {
            return "ERROR";
        }

        // 计算下一位
        num *= 2;
        if (num >= 1) {
            result[length++] = '1'; // 添加 '1'
            num -= 1;               // 减去整数部分
        } else {
            result[length++] = '0'; // 添加 '0'
        }
    }

    // 添加字符串结束符
    result[length] = '\0';
    return result;
}
相关推荐
All for pursuit.16 分钟前
【链表-9】146.LRU缓存
数据结构·c++·算法·leetcode
木子算法16 分钟前
测出来的值会抖:约束和目标带噪声时,「可行」和「更好」该怎么判
人工智能·算法·目标跟踪
圣保罗的大教堂33 分钟前
leetcode 1477. 找两个和为目标值且不重叠的子数组 中等
leetcode
剑指offer.1 小时前
嵌入式硬件-ARM芯片的启动
c语言·嵌入式硬件·嵌入式
hanlin032 小时前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode
金士曼2 小时前
从规则到涌现:算法认知的三个层次
算法
AgentMaster2 小时前
数据资产化落地难题:5款数据中台系统架构对比与实施记录
大数据·人工智能·算法
Logic1013 小时前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
鹿角片ljp3 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
圣保罗的大教堂3 小时前
leetcode 3629. 通过质数传送到达终点的最少跳跃次数 中等
leetcode