1. 题目81:求小数位数个数的实现与优化
1.1 问题分析与核心思路
这道题目要求我们计算给定浮点数的小数部分位数。看似简单,但有几个关键点需要注意:
- 输入是字符串形式的浮点数,不是真正的浮点类型(避免精度损失)
- 需要处理没有小数点的情况(如整数输入"123")
- 需要考虑末尾多余的0(如"1.200"的小数位数是3)
核心解决思路是:
- 使用字符串处理而不是数值计算
- 查找小数点的位置
- 计算小数点后的字符数量
1.2 字符串处理技巧详解
C++的string类提供了丰富的字符串操作方法,本题主要用到:
cpp复制size_t find(const string& str, size_t pos = 0) const;
size_t length() const;
具体实现时需要注意:
find()方法返回的是size_t类型,与int比较时需要类型转换string::npos是find方法未找到时的返回值- 计算小数位数时要考虑字符串长度和小数点位置的关系
1.3 完整代码解析与优化
原始代码已经很好地解决了问题,但我们可以做一些改进:
cpp复制#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
while (cin >> s) {
size_t pos = s.find('.');
if (pos == string::npos) {
cout << 0 << endl;
} else {
// 考虑可能存在科学计数法的情况(虽然题目没要求)
size_t e_pos = s.find_first_of("eE", pos);
if (e_pos == string::npos) {
cout << s.length() - pos - 1 << endl;
} else {
cout <<
