【问题标题】:Finding the tenth's place equivalent of an integer求整数的第十位等价物
【发布时间】:2014-06-11 01:13:29
【问题描述】:

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

  • 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;
}

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

【问题讨论】:

    标签: math floating-point integer floating-point-conversion integer-arithmetic


    【解决方案1】:

    伪代码:

    n / pow(10, floor(log10(n))+1)
    

    【讨论】:

    • 这可能会优于公认的答案(基本上)。
    • 我实际上发现这更好,因为上面的评论(只是注意到它:我在工作并且来回切换)但我担心它的易读性可能会放错一些地方,尽管它基本上是这样写的“将 n 除以 10 的 (log10n - 或者,有多少 10 适合 n)”
    • 感谢您的支持。我最近不得不做一些类似的事情,将数字四舍五入到 x 个有效数字
    • 您想要floor(log10(n)) + 1 而不是ceil(log10(n))?在我看来,例如,1 应该映射到 0.1
    【解决方案2】:

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

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

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

    【讨论】:

    • 多伊!很简单。负值很容易通过适当的控制结构来处理以进行检查。谢谢!
    【解决方案3】:

    [为奇怪的缩进编辑]

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

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

    [这是递归方法]

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 2017-01-02
        • 2023-04-11
        • 2015-11-19
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多