力扣面试题 - 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;
}
相关推荐
无限码力27 分钟前
科大讯飞秋招笔试真题 - 字符拼接 & 字典序最小的字符串拼接 & 圆心覆盖
算法·秋招·科大讯飞·科大讯飞笔试真题
Lips61130 分钟前
第四章 决策树
算法·决策树·机器学习
YuTaoShao40 分钟前
【LeetCode 每日一题】2053. 数组中第 K 个独一无二的字符串
算法·leetcode·职场和发展
黎雁·泠崖1 小时前
Java&C语法对比:分支与循环结构核心全解析
java·c语言
朔北之忘 Clancy1 小时前
第二章 分支结构程序设计(3)
c++·算法·青少年编程·竞赛·教材·考级·讲义
Hello_Embed1 小时前
RS485 双串口通信 + LCD 实时显示(中断版)
c语言·笔记·单片机·学习·操作系统·嵌入式
毅炼1 小时前
hot100打卡——day09
java·leetcode
想逃离铁厂的老铁1 小时前
Day42 >> 188、买卖股票的最佳时机IV + 309.最佳买卖股票时机含冷冻期 + 714.买卖股票的最佳时机含手续费
算法·leetcode·职场和发展
wu_asia2 小时前
方阵对角线元素乘积计算
数据结构·算法
想逃离铁厂的老铁2 小时前
Day43 >> 300.最长递增子序列 + 674. 最长连续递增序列+ 718. 最长重复子数组
数据结构·算法