题目:
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印"ERROR"。
示例1:
输入:0.625
输出:"0.101"
示例2:
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
提示:
- 32位包括输出中的
"0."
这两位。 - 题目保证输入用例的小数位数最多只有
6
位
思路:
- 首先需要知道小数点是如何转二进制的(乘2取整),不了解的同学可以看看这篇博客。小数的二进制表示-CSDN博客
- 那这道题应该怎么做呢?我们可以先定义一个字符数组用来存储结果。然后将num乘2,如果大于1,那么结果数组写入1,否则写入0。同时需要记录长度。
- 如果该数能被准确表示,那么他最后的小数部分最后会变为0。否则则是不能被准确表示。
- 同时,如果长度大于了32,那么他也算不能准确表示。
- 所有都判断完后,那么返回结果字符串,得解。
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;
}