0

一个人如何通过计算和动态地推导出一个整数的“第”位等价物?例如:

  • 187 为 0.187
  • 16 为 0.16
  • 900041 为 0.900041

我知道需要计算确切的位置。我知道一个技巧是把整数变成一个字符串,计算有多少个地方(有多少个单独的字符),然后创建我们的未来值乘以得到的十分之一的值 - 就像我们在笔和纸 - 例如:

char integerStr[7] = "186907";
int strLength = strlen(integerStr);
double thsPlace = 0.0F;
for (int counter = 0; counter < strLength; ++counter) {
    thsPlace = 0.1F * thsPlace;
}

但是解决这个问题的非字符串算术方法是什么?

4

4 回答 4

4

伪代码:

n / pow(10, floor(log10(n))+1)
于 2014-06-11T01:18:45.363 回答
1

将原始值反复除以 10,直到小于 1:

int x = 69105;
double result = (double) x;
while (x > 1.0) x /= 10.0;
/* result = 0.69105 */

请注意,这不适用于负值;对于那些,您需要对绝对值执行算法,然后否定结果。

于 2014-06-11T01:19:44.463 回答
1

[编辑为奇怪的缩进]

我不确定你的问题到底是什么意思,但我会这样做:

int placeValue(int n)
{
    if (n < 10)
    {
        return 1;
    }
    else
    {
        return placeValue(n / 10) + 1;
    }
}

[这是一种递归方法]

于 2014-06-11T01:20:35.617 回答
0

我不知道这个pow(10, x)版本的性能如何,但你可以尝试用整数算术来完成大部分工作。假设我们只处理正值或 0(如有必要,使用绝对值):

  int divisor = 1;
  while (divisor < x)
    divisor *= 10; 
  if (divisor > 0)
    return (double)x / divisor; 

请注意,上面需要一些保护措施,即检查除数是否可能溢出(在这种情况下,它会是负数),如果 x 是正数,等等。但我假设你可以自己做。

于 2014-06-11T10:21:06.770 回答