AC题解
2026-05-02 13:20:55
发布于:重庆
0阅读
0回复
0点赞
思路说明
题目要求:将十进制小数转换为二进制小数,并输出小数点后第 m 位的数值。
- 问题的难点
十进制小数转二进制小数使用 “乘2取整” 方法:每次将小数部分乘以2,取整数部分(0或1)作为二进制位,再用新的小数部分继续乘2。
但是题目中输入的实数可能很长(如 10.123),直接使用浮点数会造成精度丢失,无法准确得到指定位。
因此需要精确模拟小数部分的乘2运算,而不依赖于浮点计算。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string n_str;
int m;
cin >> n_str >> m;
// 忽略可能的负号(小数部分与符号无关)
if (n_str[0] == '-') {
n_str = n_str.substr(1);
}
// 分离小数部分
size_t dot = n_str.find('.');
string frac;
if (dot != string::npos) {
frac = n_str.substr(dot + 1);
} else {
frac = "";
}
int L = frac.length();
if (L == 0) {
// 没有小数部分,所有二进制位均为0
cout << 0 << endl;
return 0;
}
// 将小数部分的每一位存入数组(高位在前)
vector<int> digits(L);
for (int i = 0; i < L; ++i) {
digits[i] = frac[i] - '0';
}
int ans = 0;
for (int i = 0; i < m; ++i) {
// 若当前小数部分已为0,后续位均为0
bool all_zero = true;
for (int d : digits) {
if (d != 0) {
all_zero = false;
break;
}
}
if (all_zero) {
ans = 0;
break;
}
// 整体乘以2,从最低位开始处理进位
int carry = 0;
for (int j = L - 1; j >= 0; --j) {
int val = digits[j] * 2 + carry;
digits[j] = val % 10;
carry = val / 10;
}
// 进位存在则表示当前二进制位为1,否则为0
ans = (carry > 0) ? 1 : 0;
}
cout << ans << endl;
return 0;
}
这里空空如也







有帮助,赞一个