如何在c++;? 我想找出C++中数字的位数,但我不知道该怎么办?例如,数字76575的位数。

如何在c++;? 我想找出C++中数字的位数,但我不知道该怎么办?例如,数字76575的位数。,c++,C++,取该数字以10为底对数的上限。(或者更一般地说,“base-N”表示基数N中的位数。) 在代码中:std::ceil(std::log10(n+1)),并确保包含 (作为特例,您将获得输入0的答案0。如何处理负数取决于您。) @Knaģis答案中的代码可能效率更高,因为常量10的除法可以由编译器转换为乘法,而且价格相当便宜。您必须分析和比较这是否是性能关键,以及这是否仅适用于积分类型。对数方法还允许您计算非常大的浮点数的假设十进制扩展中的位数 int i = 7676575; int digit

取该数字以10为底对数的上限。(或者更一般地说,“base-N”表示基数N中的位数。)

在代码中:
std::ceil(std::log10(n+1))
,并确保包含

(作为特例,您将获得输入
0
的答案
0
。如何处理负数取决于您。)


@Knaģis答案中的代码可能效率更高,因为常量10的除法可以由编译器转换为乘法,而且价格相当便宜。您必须分析和比较这是否是性能关键,以及这是否仅适用于积分类型。对数方法还允许您计算非常大的浮点数的假设十进制扩展中的位数

int i = 7676575;
int digits = i == 0 ? 1 : 0;
i = abs(i); // handle negative numbers as well
while (i > 0)
{
    digits++;
    i /= 10;
}

// -or- if you prefer do/while then a shorter sample (by Kerrek SB)

int i = 7676575;
int digits = 0;
i = abs(i); // handle negative numbers as well
do { digits++; } while (i /= 10);
int number = getNumberFromSomewhere();

stringstream ss;

ss << number;
size_t numDigits = ss.str().length();
int number=GetNumberFromsomeone();
细流ss;
ss
模板
整数位数(tV)
{
ti=std::abs(v);
如果(i<10)返回1;
否则,如果(i<100)返回2;
...
否则,如果(i<100000000)返回8;
否则,如果(i<100000000)返回9;
}
以此类推,你可以扩展到包括长程,而不仅仅是int。我不确定这是否比除法快,但为什么不呢?它只是10个比较


我想模板黑魔法可以用来生成只需要ifs数量的函数,但谁在乎呢。但是您可以使用std::enable_if确保T是整数。

您可以转换为字符串并检查字符串的长度:

std::to_string(number).size()

+1这可能比使用浮点运算效率更高。当(i/=10)时,
do++数字如何?如果输入是一个整数(问题没有说明),它可能比基于对数的方法更准确,因为对于大的输入值,非常接近数字计数的变化,有时可能是错误的。”因为浮点非常接近右边,但并不总是精确的。@DRVic:另一方面,对数可以给你一个数字的位数,你永远无法用
int
:-)奇怪的是,在某些体系结构中,这包括了你永远无法用int(或变体)表示的整数。存在双精度尾数为48位的计算机,但长度为32位。还需要检查
n==0
。再加上对abs(n)
的调用仍然不太清楚:
std::floor(std::log10(n))+1
(想想n=100)。对不起,我怎么用它呢?我想保存数字的数量我需要它在c++Hm中进行大数乘法,你使用什么算法?大的数字可以很容易地使用位移位进行乘法(参见维基百科),我不明白为什么需要小数位数。不,输入字符串可能是一个好主意,仅适用于十进制数字(并且只有在您能够保证if
string(1/2)的情况下)
没有呈现为
0.499999999999999999
。是的,它适用于他的整数示例。关于浮点数,这一点很好。如果结果证明这比其他方法更快,尤其是如果您了解输入的分布,则可以将测试重新排序,使其更像二进制搜索tter.输入是否同样可能有任意数量的数字,或者它们是否同样可能是某个范围内的任意值?如果是后者,则从最大值向下计算到最小值会更快,因为0到10^n范围内的大多数数字都有n个数字。如果要优化,可以缩小范围,如“If(!(i&0xFFFF0000)){}”然后只执行5个ifs。但坦率地说,我不认为这是性能关键代码(即避免过早优化)。我只需要编写一个足以处理ULL数字的范围,然后在profiler告诉我之前将其忘记。更重要的是,topic starter是指浮点数吗。
std::to_string(number).size()