我正在寻找一种方法来确定整数的长度(数字个数)并将其放置在一个整数数组中。该任务还要求在不使用STL类的情况下完成,尽管程序规范说我们可以使用“常见的C库”(我打算问我的教授是否可以使用cmath库,因为我认为log10(num) + 1是最简单的方法,但我想知道是否还有其他方法)。
啊,这个程序不必处理负数。只处理非负数。
我正试图创建一个“MyInt”类的变体,使用动态数组处理更广泛范围的值。任何提示都将不胜感激!谢谢!
不一定是最高效的,但以下是使用C++编写的最短且最易读的代码之一:
std::to_string(num).length()
n
的位数可以通过除法轻松获得: 将该数一直除以进制数,直到商为零为止。
unsigned int number_of_digits = 0;
do {
++number_of_digits;
n /= base;
} while (n);
log10
的解决方案,我更喜欢这个,但为了可读性,我更希望使用一个更明确的 while (n != 0)
。不过,这仍然值得点赞。 - paxdiablo #include<cmath>
...
int size = trunc(log10(num)) + 1
....
int size = num == 0 ? 1 : (num < 0 ? static_cast<int>(log10(std::abs(num))) + 1 : static_cast<int>(log10(num)) + 1);
如果您可以使用C库,那么一种方法是使用sprintf函数,例如:
#include <cstdio>
char s[32];
int len = sprintf(s, "%d", i);
snprintf(nullptr, 0, "%d", i)
来代替s
,无需使用s
。 - Tony Delroynullptr
解决方案可以解决这个问题。 - paxdiablo"我的意思是整数中数字的数量,比如说'123'的长度为3"
int i = 123;
// the "length" of 0 is 1:
int len = 1;
// and for numbers greater than 0:
if (i > 0) {
// we count how many times it can be divided by 10:
// (how many times we can cut off the last digit until we end up with 0)
for (len = 0; i > 0; len++) {
i = i / 10;
}
}
// and that's our "length":
std::cout << len;
输出 3
计算最长int
的闭合公式(这里使用int
,但适用于任何有符号整型):
1 + (int) ceil((8*sizeof(int)-1) * log10(2))
解释:
sizeof(int) // number bytes in int
8*sizeof(int) // number of binary digits (bits)
8*sizeof(int)-1 // discount one bit for the negatives
(8*sizeof(int)-1) * log10(2) // convert to decimal, because:
// 1 bit == log10(2) decimal digits
(int) ceil((8*sizeof(int)-1) * log10(2)) // round up to whole digits
1 + (int) ceil((8*sizeof(int)-1) * log10(2)) // make room for the minus sign
int
类型,结果为11。一个有11个十进制数字的4字节int
的例子是:“-2147483648”。int
值的十进制位数,可以使用以下函数:unsigned base10_size(int value)
{
if(value == 0) {
return 1u;
}
unsigned ret;
double dval;
if(value > 0) {
ret = 0;
dval = value;
} else {
// Make room for the minus sign, and proceed as if positive.
ret = 1;
dval = -double(value);
}
ret += ceil(log10(dval+1.0));
return ret;
}
我在g++ 9.3.0(x86-64)下测试了整个int
范围的函数。
ceil(log10(var+1))
在INT_MAX的情况下会失败。 (意思是取一个整数变量 var 的位数时,使用这个公式会出错,因为 INT_MAX 已经超出了该数据类型能表示的最大值,导致公式计算失败) - brickloreint intLength(int i) {
int l=0;
for(;i;i/=10) l++;
return l==0 ? 1 : l;
}
int num = 123
string strNum = to_string(num); // 123 becomes "123"
int length = strNum.length(); // length = 3
char array[3]; // or whatever you want to do with the length
最好的方法是使用日志查找,它总是有效的。
int len = ceil(log10(num))+1;
以下是针对0和负数同样适用的解决方案:
int digits( int x ) {
return ( (bool) x * (int) log10( abs( x ) ) + 1 );
}
int len = n?0:1; while (n) { len++, n/=10 }
- sehe