我最近正在制作一个程序,该程序需要检查用户输入的数字中的位数。结果,我编写了以下代码:
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++;