【问题标题】:How to count digits of given number?如何计算给定数字的位数?
【发布时间】:2020-03-07 03:34:59
【问题描述】:

我希望用户输入一个数字并打印回该数字的位数。

我知道我可以使用length,但我的作业要求使用while 循环。

这是我目前所拥有的:

var num;
var count = 0;

num = prompt('Enter number: ');

function counter(x, y) {
  while (x > 0) {
    y++;
    x /= 10;
  }
  return y;
}

var result = counter(num, count);

console.log(result);

当我给出号码3456(示例)时,我会返回号码328。我希望它打印回号码4

【问题讨论】:

  • 将数字转换为字符串并访问.length属性
  • @nickzoum 这是一种方法
  • 应该0 返回0 还是1
  • @EricWu 当你学习一种乐器时,你被告知要演奏音阶和琶音,不是因为它们好听,而是因为它们教你技巧。编码练习通常是相似的:简化和限制,以便您学习思考算法和程序设计的方法。通常,可能有一整套“现在不用这个内置的就做”。
  • 我们还要提一下在没有循环且不将其视为字符串的情况下执行此操作的数学方法。这是取基于 10 的对数的整数部分并加 1。Math.floor(Math.log10(Math.abs(num))) + 1 取绝对值使其也适用于负数。 0 是一个特例。

标签: javascript while-loop numbers


【解决方案1】:

问题是除法运算最终会将x 转换为浮点数,您将得到类似的结果:

x / 10 === 0.1;
x / 10 === 0.01;
x / 10 === 0.001;
....

如果你总是将除法的结果解析(四舍五入)为整数,你会得到预期的结果。

var num;
var count = 0;

num = prompt('Enter number: ');

function counter(x, y) {
  while (x > 0) {
    y++;
    x = parseInt(x / 10);
  }
  return y;
}

var result = counter(num, count);

console.log(result);

【讨论】:

  • 在数字上使用parseInt 是错误的......“解析”意味着从字符串中解析出一些东西。
【解决方案2】:

首先你应该将输入转换为数字,最好使用Number函数(使用一元+具有相同的效果)。

其次,像5 / 10 这样的除法将返回大于00.5。您应该检查该数字是否大于或等于1

function counter(num) {
  num = Math.abs(num) / 10;
  var count = 1;  
  while (num >= 1) {
    count++;
    num /= 10;
  }
  return count;
}

console.log(counter(+prompt('Enter number: ')));

您还可以使用do while 循环并避免在循环外有额外的除法。

【讨论】:

    【解决方案3】:

    正如其他人指出的那样,y 不需要是参数,它可以是局部变量。但这不是你的问题;让我们在循环中添加一些额外的日志记录:

    function counter(x) {
      let y=0;
      while (x > 0) {
        console.log("x=" + x + ", y=" + y);
        y++;
        x /= 10;
      }
      return y;
    }
    counter(3456);
    

    输出如下所示:

    x=3456, y=0
    x=345.6, y=1
    x=34.56, y=2
    x=3.4560000000000004, y=3
    x=0.3456, y=4
    x=0.03456, y=5
    ...
    

    您希望循环在0.3456 处停止,但这仍然比0 多。 (这个错误实际上让你有机会学习一些额外的东西:你能解释为什么循环会结束吗?)

    希望这会给你足够的提示来完成家庭作业 - 请记住,调试是编程的一个极其重要的部分。

    【讨论】:

      【解决方案4】:

      这一行:

      x /= 10;
      

      应改为:

      x = Math.floor(x / 10);
      

      逻辑假设整数除法:1234 应该变成 123、12、1 和 0。JavaScript 没有内置整数除法,因此您需要使用 Math.floor 来模拟它。包含一些修复的完整示例:

      function countDigits(num) {
        var count = 0;
        while (num > 0) {
          num = Math.floor(num / 10);
          count++;
        }
        return count;
      }
      
      var num;
      do {
        num = Number(prompt("Enter number:"));
      } while (Number.isNaN(num));
      num = Math.abs(num); // just in case you want to handle -ve numbers
      var result = countDigits(num);
      console.log(result);

      【讨论】:

        【解决方案5】:

        您可以通过小数的幂来检查一个数字。

        function counter(value) {
            var decimals = 0;
            do {
                decimals++;
            } while (value >= 10 ** decimals)
            return decimals;
        }
        
        console.log(counter(0));
        console.log(counter(1));
        console.log(counter(7));
        console.log(counter(42));
        console.log(counter(999));
        console.log(counter(1000));
        console.log(counter(1001));

        【讨论】:

          【解决方案6】:

          请不要使用循环来测量整数的长度...

          改用数学!对数会为您做得更好。

          function numberLength(number) {
              return Math.floor(Math.log10(Math.abs(number))) + 1
          }
          
          console.log(numberLength(YOUR_NUMBER));
          

          当输入为0 时,此代码返回NaN。我认为这取决于您的理念 0 应该有多长,所以我不处理这个案子。

          【讨论】:

          • 这是一个与 JavaScript 相关的家庭作业,特别要求使用循环,而不是数学。
          • @Salman A 我知道,但是在做不同的作业时会有其他人阅读这个,搜索引擎可能会引导他们提出这个问题。所以他们应该能够在这里找到更好的解决方案。 :-)
          • 数字参数最好使用Math.floor 而不是parseInt
          • @georg 谢谢!我其实对 JavaScript 一无所知,哈哈 :D
          • 这是一个编码练习。如果您认为问题应该更清楚,那么建议对该问题进行编辑,但因为它已经说“我知道我可以使用length,但我的作业要求while循环”这只是对所问问题的错误答案
          猜你喜欢
          • 1970-01-01
          • 2012-09-25
          • 1970-01-01
          • 2012-02-25
          • 2017-08-06
          • 2018-06-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多