力扣面试题 - 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;
}
相关推荐
oioihoii2 分钟前
C++共享内存小白入门指南
java·c++·算法
Bruce_kaizy4 分钟前
c++图论————图的基本与遍历
c++·算法·图论
LinHenrY12277 分钟前
初识C语言(编译和链接)
c语言·开发语言·蓝桥杯
l1t8 分钟前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
亭上秋和景清10 分钟前
strlen;strcpy ;strcat
算法
_OP_CHEN11 分钟前
【算法基础篇】(三十五)图论基础之最小生成树:从原理到实战,彻底吃透 Prim 与 Kruskal 算法
算法·蓝桥杯·图论·最小生成树·kruskal算法·prim算法·acm/icpc
LYFlied16 分钟前
【算法解题模板】-【回溯】----“试错式”问题解决利器
前端·数据结构·算法·leetcode·面试·职场和发展
拾忆,想起19 分钟前
设计模式:软件开发的可复用武功秘籍
开发语言·python·算法·微服务·设计模式·性能优化·服务发现
lxh011325 分钟前
最长有效括号
数据结构·算法
橙子牛奶糖28 分钟前
Science | 本周最新文献速递
算法·gwas·生物信息学·单细胞测序