最近我在编写一个程序,需要检查用户输入的数字中有多少位数。因此,我编写了以下代码:
int x;
cout << "Enter a number: ";
cin >> x;
x /= 10;
while(x > 0)
{
count++;
x = x/10;
}
据我所知(尽管我的经验有限),这段代码似乎粗糙而不够优雅。
有没有人有改进这段代码的想法(同时不使用内置的c++函数)?
最近我在编写一个程序,需要检查用户输入的数字中有多少位数。因此,我编写了以下代码:
int x;
cout << "Enter a number: ";
cin >> x;
x /= 10;
while(x > 0)
{
count++;
x = x/10;
}
据我所知(尽管我的经验有限),这段代码似乎粗糙而不够优雅。
有没有人有改进这段代码的想法(同时不使用内置的c++函数)?
在您的特定示例中,您可以将数字读取为字符串并计算字符数。
但对于一般情况,您可以按照您的方式进行操作,或者您可以使用基于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;
}
int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;
cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();
x
是一个整数,并且“内置函数”不包括对数,那么你可以这样做。double doub_x=double(x);
double digits=log(abs(doub_x))/log(10.0);
int digits= int(num_digits);
假设有一个非常流水线化的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次迭代。
#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;
}
除了将数字读作字符串的建议外,您当前计算显著十进制位数的方法很好。您可以将其缩短,但这可能会导致不太清晰(添加一组额外括号以防止gcc发出警告):
while((x = x/10))
count++;
x
是一个int
,否则这个代码将永远不会达到0
。 - Naftali