我最近制作的程序需要检查用户输入的数字中的位数。结果我做了以下代码:
int x;
cout << "Enter a number: ";
cin >> x;
x /= 10;
while(x > 0)
{
count++;
x = x/10;
}
据我所知(即使我的经验有限),它看起来粗糙而且相当不优雅。
有没有人知道如何改进此代码(而不使用内置的c ++函数)?
答案 0 :(得分: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;
}
答案 1 :(得分:5)
int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;
答案 2 :(得分:2)
您可以将用户输入作为字符串读取,然后对字符进行计数? (消毒和修剪后等)。
或者,你可以找一个图书馆为你做艰苦的工作;将值转换回字符串,然后计算字符:
cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();
答案 3 :(得分:1)
如果x
是一个整数,并且“内置函数”你不排除对数,那么你可以做
double doub_x=double(x);
double digits=log(abs(doub_x))/log(10.0);
int digits= int(num_digits);
答案 4 :(得分: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次迭代。
答案 5 :(得分: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;
}
答案 6 :(得分:-1)
禁止将数字作为字符串读取,您当前计算有效小数位数的方法很好。你可以缩短它,但这可能不太清楚(增加了一组括号以防止gcc发出警告):
while((x = x/10))
count++;