【问题标题】:Counting digits using while loop使用while循环计算数字
【发布时间】:2011-09-29 21:42:07
【问题描述】:

我最近正在制作一个程序,该程序需要检查用户输入的数字中的位数。结果我做了以下代码:

int x;    
cout << "Enter a number: ";
cin >> x;
x /= 10;
while(x > 0)
{
  count++;
  x = x/10;
}

据我所知(即使我的经验有限),它看起来很粗糙而且相当不雅。

有没有人知道如何改进这段代码(而不使用内置的 c++ 函数)?

【问题讨论】:

  • 我假设xint,否则这将永远到达0
  • 循环前你是谁做的划分?
  • 如果您不能使用内置函数,那么您就会遇到“粗鲁和不雅”的问题。
  • 什么意思,没有内置函数?例如,在 ARM CPU 上,除法运算符是一个内置函数。
  • 抱歉,需要澄清一下。我假设有一种方法可以使用 C++ 标准库中的某个函数简单地计算整数中的位数(我当然可能是错误的)。为了了解有关 C++ 的更多信息,我决定尝试自己编写大部分代码,只是为了了解这些代码是如何工作的,因此尝试“手动”计算位数。

标签: c++ while-loop digits counting


【解决方案1】:

在您的特定示例中,您可以将数字读取为字符串并计算字符数。

但对于一般情况,您可以按照自己的方式进行,也可以使用以 10 为底的对数。

这是对数示例:

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    double n;
    cout << "Enter a number: ";
    cin >> n;

    cout << "Log 10 is " << log10(n) << endl;
    cout << "Digits are " << ceil(log10(fabs(n)+1)) << endl;
    return 0;
}

【讨论】:

  • log10(10) == 1,所以我认为你需要floor(log10(n)) + 1
  • 试试 x=0,或 x=-1,或 x=999.999。
  • @David:让我们将这个程序的域定义为从 1 到无穷大的整数。虽然我确实修复了它来处理负数。 :-)
  • @David:嗯,前导零从数字中消失了。由此概括,我们可以声称所有前导零都消失了。因此,0 完全等于没有,正确地称为 0 位。 :-)
【解决方案2】:
int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;

【讨论】:

  • 不,对于 x = 0,这给出了正确的结果 except,已更正。
【解决方案3】:

您可以将用户输入读取为字符串,然后计算字符数吗? (经过消毒、修剪等)

或者,您可以找一个库来为您完成繁重的工作;将值转换回字符串,然后计算字符数:

cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();

【讨论】:

    【解决方案4】:

    如果x 是一个整数,并且通过“内置函数”你不排除对数,那么你可以这样做

    double doub_x=double(x);
    double digits=log(abs(doub_x))/log(10.0);
    int digits= int(num_digits);
    

    【讨论】:

      【解决方案5】:

      给定一个带有条件移动的非常流水线的 cpu,这个例子可能会更快:

      if (x > 100000000) { x /= 100000000; count += 8; }
      if (x > 10000) { x /= 10000; count += 4; }
      if (x > 100) { x /= 100; count += 2; }
      if (x > 10) { x /= 10; count += 1; }
      

      因为它已完全展开。不过,一个好的编译器也可以将 while 循环展开到最多 10 次迭代。

      【讨论】:

        【解决方案6】:
        #include<iostream>
        using namespace std;
        int main()
        {
        int count=0;
            double x;
            cout << "Enter a number: ";
            cin >> x;
            x /= 10;
            while(x > 1)
            {
              count++;
              x = x/10;
            }
            cout<<count+1;
        }
        

        【讨论】:

          【解决方案7】:

          除了将数字读取为字符串的建议之外,您当前计算有效小数位数的方法很好。您可以缩短它,但这可能不太清楚(添加了一组额外的括号以防止 gcc 发出警告):

          while((x = x/10))
            count++;
          

          【讨论】:

            猜你喜欢
            • 2021-12-19
            • 1970-01-01
            • 2017-07-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-23
            相关资源
            最近更新 更多