7

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

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

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

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

4

7 回答 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;
}
于 2011-07-06T19:08:41.147 回答
5
int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;
于 2011-07-06T19:14:18.960 回答
2

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

或者,您可以让图书馆为您完成艰苦的工作;将值转换回字符串,然后计算字符数:

cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();
于 2011-07-06T19:08:30.890 回答
1

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

double doub_x=double(x);
double digits=log(abs(doub_x))/log(10.0);
int digits= int(num_digits);
于 2011-07-06T19:14:11.313 回答
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 次迭代。

于 2011-07-06T20:14:34.590 回答
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;
}
于 2013-10-09T14:01:59.920 回答
-1

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

while((x = x/10))
  count++;
于 2011-07-06T19:13:32.333 回答