使用while循环计算数字的个数

7

最近我在编写一个程序,需要检查用户输入的数字中有多少位数。因此,我编写了以下代码:

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

据我所知(尽管我的经验有限),这段代码似乎粗糙而不够优雅。

有没有人有改进这段代码的想法(同时不使用内置的c++函数)?


我假设 x 是一个 int,否则这个代码将永远不会达到 0 - Naftali
你为什么要在循环之前进行除法运算? - Karoly Horvath
如果你不能使用内置函数,那么你只能使用粗糙和不优雅的方法。 - Mark Ransom
什么意思,没有内置函数?例如,在ARM CPU上,除法运算符就是一个内置函数。 - Zan Lynx
1
抱歉,我需要澄清一下。我假设在C++标准库中有一种方法可以使用某个函数简单地计算整数中数字的数量(当然我可能是错的)。为了更好地了解C++,我决定尝试自己编写大部分代码,以便了解其工作原理,因此尝试手动计算数字的数量。 - E.O.
7个回答

12

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

但对于一般情况,您可以按照您的方式进行操作,或者您可以使用基于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;
}

3
“log10(10) == 1”,因此我认为您需要使用“floor(log10(n)) + 1”。该短语意为取以10为底n的对数并向下取整,再加1。 - Oliver Charlesworth
3
请尝试将x赋值为0、-1或999.999。 - David Hammen
1
@David:让我们将此程序的域定义为从1到无穷大的整数。尽管我已经修复了它以处理负数。 :-) - Zan Lynx
@David:嗯,数字中的前导零会消失。从这个角度来看,我们可以得出结论,所有的前导零都会消失。因此,0 等于什么都没有,应该被称为 0 位数字。 :-) - Zan Lynx

5
int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;

不,这个结果是正确的,除了 x = 0,已经更正。 - David Hammen

2
你可以将用户输入读取为字符串,然后计算字符数(在进行清理和修剪等操作之后)。
或者,你可以使用一个库来帮助你完成这项艰巨的工作;将值转换回字符串,然后计算字符数。
cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();

1
如果x是一个整数,并且“内置函数”不包括对数,那么你可以这样做。
double doub_x=double(x);
double digits=log(abs(doub_x))/log(10.0);
int digits= int(num_digits);

1

假设有一个非常流水线化的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次迭代。


0
#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;
}

-1

除了将数字读作字符串的建议外,您当前计算显著十进制位数的方法很好。您可以将其缩短,但这可能会导致不太清晰(添加一组额外括号以防止gcc发出警告):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接