题目描述:
不考虑非法输入,边界情况,溢出截断等,把如下字符串转换成浮点数。例如“123.45”,转成123.45.
方法一:
从前到后扫描字符串,没有遇到‘.’号前,结果乘10然后累加当前数值;遇到‘.’号后,当前数值乘以factor并累积到当前结果上。实现如下。
float strToFloatCore(const char *pStr)
{
bool beforeDecimal = true;
float decimalFactor = 0.1;
float result = 0;
while (*pStr!='\0')
{
if (*pStr == '.')
{
beforeDecimal = false;
}
else
{
int value = *pStr - '0';
if (beforeDecimal)
{
result = result * 10 + value;
}
else
{
result += decimalFactor*value;
decimalFactor /= 10.0;
}
}
pStr++;
}
return result;
}
方法二:
从头到尾扫描字符串,中间结果乘10然后累加当前字符,遇到‘.’号开始累积factor;最后把中间结果除以factor。实现如下:
float strToFloatCore2(const char *pStr)
{
float divider = 0.1;
float result = 0;
while (*pStr != '\0')
{
if (*pStr == '.')
{
divider *= 10;
}
else
{
result = result * 10 + *pStr - '0';
if (divider>0.5)
{
divider *= 10;
}
}
pStr++;
}
return result / divider;
}
以上两种方法在时间复杂度上是相同的O(n),都在一个循环内完成,并没有明显的优劣。当然有人不这么认为,我只能呵呵了。