我想知道如何在C中找到整数的长度。
例如:
等等。
我怎样才能在C中做到这一点?
答案 0 :(得分:94)
为什么不直接取数字绝对值的10-log,将其四舍五入,然后加一?这适用于非0的正数和负数,并且避免必须使用任何字符串转换函数。
log10
,abs
和floor
函数由math.h
提供。例如:
int nDigits = floor(log10(abs(the_integer))) + 1;
你应该将这个包装在一个条款中,确保the_integer != 0
,因为log10(0)
根据-HUGE_VAL
返回man 3 log
。
此外,如果输入为负数,您可能希望在最终结果中添加一个,如果您对数字的长度感兴趣,包括其负号。
int nDigits = Math.floor(Math.log10(Math.abs(the_integer))) + 1;
N.B。此方法涉及的计算的浮点特性可能会导致它比更直接的方法更慢。有关效率的讨论,请参阅Kangkan答案的评论。
答案 1 :(得分:45)
如果您对快速和非常简单的解决方案感兴趣,以下内容可能最快(这取决于相关数字的概率分布):< / p>
int lenHelper(unsigned x) {
if (x >= 1000000000) return 10;
if (x >= 100000000) return 9;
if (x >= 10000000) return 8;
if (x >= 1000000) return 7;
if (x >= 100000) return 6;
if (x >= 10000) return 5;
if (x >= 1000) return 4;
if (x >= 100) return 3;
if (x >= 10) return 2;
return 1;
}
int printLen(int x) {
return x < 0 ? lenHelper(-x) + 1 : lenHelper(x);
}
虽然它可能无法为最巧妙的解决方案赢得奖品,但理解并且执行起来也微不足道 - 所以它很快。
在使用MSC的Q6600上,我使用以下循环对此进行基准测试:
int res = 0;
for(int i = -2000000000; i < 2000000000; i += 200) res += printLen(i);
这个解决方案需要0.062秒,Pete Kirkham使用智能对数方法的第二快解决方案需要0.115秒 - 差不多两倍。但是,对于10000左右及以下的数字,智能日志更快。
以牺牲一些清晰度为代价,您可以更可靠地击败智能日志(至少在Q6600上):
int lenHelper(unsigned x) {
// this is either a fun exercise in optimization
// or it's extremely premature optimization.
if(x >= 100000) {
if(x >= 10000000) {
if(x >= 1000000000) return 10;
if(x >= 100000000) return 9;
return 8;
}
if(x >= 1000000) return 7;
return 6;
} else {
if(x >= 1000) {
if(x >= 10000) return 5;
return 4;
} else {
if(x >= 100) return 3;
if(x >= 10) return 2;
return 1;
}
}
}
此解决方案对于大数字仍然是0.062秒,对于较小的数字,降级到大约0.09秒 - 两种情况都比智能对数方法更快。 (gcc使代码更快;此解决方案为0.052,智能对数方法为0.09)。
答案 2 :(得分:24)
int get_int_len (int value){
int l=1;
while(value>9){ l++; value/=10; }
return l;
}
,第二个也适用于负数:
int get_int_len_with_negative_too (int value){
int l=!value;
while(value){ l++; value/=10; }
return l;
}
答案 3 :(得分:18)
您可以编写如下函数:
unsigned numDigits(const unsigned n) {
if (n < 10) return 1;
return 1 + numDigits(n / 10);
}
答案 4 :(得分:10)
n的长度:
length = ( i==0 ) ? 1 : (int)log10(n)+1;
答案 5 :(得分:7)
整数x
的位数等于1 + log10(x)
。所以你可以这样做:
#include <math.h>
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
printf("x has %d digits\n", 1 + (int)log10(x));
}
或者你可以运行一个循环来自己计算数字:整数除以10,直到数字为0:
int numDigits = 0;
do
{
++numDigits;
x = x / 10;
} while ( x );
如果第一个解决方案中的整数为1
,您必须要小心返回0
,并且您可能还想要处理负整数(如果{-x
则使用x < 0
1}})。
答案 6 :(得分:7)
是的,使用sprintf。
int num;
scanf("%d",&num);
char testing[100];
sprintf(testing,"%d",num);
int length = strlen(testing);
或者,您可以使用log10
函数以数学方式执行此操作。
int num;
scanf("%d",&num);
int length;
if (num == 0) {
length = 1;
} else {
length = log10(fabs(num)) + 1;
if (num < 0) length++;
}
答案 7 :(得分:6)
最有效的方法可能是使用基于快速对数的方法,类似于用于确定整数中最高位集的方法。
size_t printed_length ( int32_t x )
{
size_t count = x < 0 ? 2 : 1;
if ( x < 0 ) x = -x;
if ( x >= 100000000 ) {
count += 8;
x /= 100000000;
}
if ( x >= 10000 ) {
count += 4;
x /= 10000;
}
if ( x >= 100 ) {
count += 2;
x /= 100;
}
if ( x >= 10 )
++count;
return count;
}
对于我上网本上的2000万次通话,这个(可能是不成熟的)优化需要0.65秒;像zed_0xff这样的迭代划分需要1.6s,像Kangkan这样的递归划分需要1.8s,并且使用浮点函数(Jordan Lewis的代码)需要高达6.6s。使用snprintf需要11.5秒,但会为你提供snprintf对任何格式所需的大小,而不仅仅是整数。 Jordan报告说他的处理器没有保留时序的顺序,它的浮点比我的浮点快。
最简单的可能是询问snprintf的打印长度:
#include <stdio.h>
size_t printed_length ( int x )
{
return snprintf ( NULL, 0, "%d", x );
}
int main ()
{
int x[] = { 1, 25, 12512, 0, -15 };
for ( int i = 0; i < sizeof ( x ) / sizeof ( x[0] ); ++i )
printf ( "%d -> %d\n", x[i], printed_length ( x[i] ) );
return 0;
}
答案 8 :(得分:5)
正确的snprintf
实施:
int count = snprintf(NULL, 0, "%i", x);
答案 9 :(得分:4)
int digits=1;
while (x>=10){
x/=10;
digits++;
}
return digits;
答案 10 :(得分:2)
您可以使用此 -
(DATA_TYPE)LOG10(变量名)1
前:
len =(int)log10(number)+1;
答案 11 :(得分:1)
非常简单
int main() {
int num = 123;
char buf[50];
// convert 123 to string [buf]
itoa(num, buf, 10);
// print our string
printf("%s\n", strlen (buf));
return 0;
}
答案 12 :(得分:1)
在这个问题上,我使用了一些算术解决方案。谢谢:)
int main(void)
{
int n, x = 10, i = 1;
scanf("%d", &n);
while(n / x > 0)
{
x*=10;
i++;
}
printf("the number contains %d digits\n", i);
return 0;
}
答案 13 :(得分:1)
sprintf(s, "%d", n);
length_of_int = strlen(s);
答案 14 :(得分:1)
为什么不将整数转换为 String 并获得这样的长度:
int data = 123;
int data_len = String(data).length();
答案 15 :(得分:0)
请在一行代码中找到我的答案:
#include <stdio.h>
int main(void){
int c = 12388884;
printf("length of integer is: %d",printf("%d",c));
return 0;
}
那是简单而聪明的! 如果您喜欢,请投票!
答案 16 :(得分:0)
int returnIntLength(int value){
int counter = 0;
if(value < 0)
{
counter++;
value = -value;
}
else if(value == 0)
return 1;
while(value > 0){
value /= 10;
counter++;
}
return counter;
}
我认为这种方法非常适合此任务:
值和答案:
-50-> 3 //如果您不想计数,它将也算作一个字符 减去然后从第5行中删除counter ++。
566666-> 6
0-> 1
505-> 3
答案 17 :(得分:0)
在我看来,最简单和最简单的解决方案是:
int length , n;
printf("Enter a number: ");
scanf("%d", &n);
length = 0;
while (n > 0) {
n = n / 10;
length++;
}
printf("Length of the number: %d", length);
答案 18 :(得分:0)
这对消极和积极的反叛者都适用
int get_len(int n)
{
if(n == 0)
return 1;
if(n < 0)
{
n = n * (-1); // if negative
}
return log10(n) + 1;
}
相同的逻辑会循环
int get_len(int n)
{
if(n == 0)
return 1;
int len = 0;
if(n < 0)
n = n * (-1);
while(n > 1)
{
n /= 10;
len++;
}
return len;
}
答案 19 :(得分:0)
更详细的方法是使用此功能。
int length(int n)
{
bool stop;
int nDigits = 0;
int dividend = 1;
do
{
stop = false;
if (n > dividend)
{
nDigits = nDigits + 1;
dividend = dividend * 10;
}
else {
stop = true;
}
}
while (stop == false);
return nDigits;
}
答案 20 :(得分:0)
int intlen(int integer){
int a;
for(a = 1; integer /= 10; a++);
return a;
}
答案 21 :(得分:0)
我的方式:
除非数字不再被10整除,否则除以
u8 NumberOfDigits(u32 number)
{
u8 i = 1;
while (number /= 10) i++;
return i;
}
我不知道与其他命题相比有多快..
答案 22 :(得分:0)
保持除以10,直到你得到零,然后输出分数。
int intLen(int x)
{
if(!x) return 1;
int i;
for(i=0; x!=0; ++i)
{
x /= 10;
}
return i;
}
答案 23 :(得分:-1)
int main(void){ unsigned int n,大小= 0;
printf("get the int:");
scanf("%u",&n);
/*the magic*/
for(int i = 1; n >= i; i*=10){
size++;
}
printf("the value is: %u \n", n);
printf("the size is: %u \n", size);
return 0;
}
答案 24 :(得分:-1)
我想我找到了找到整数长度的最有效方法 它是一种非常简单而优雅的方式 这是:
int PEMath::LengthOfNum(int Num)
{
int count = 1; //count starts at one because its the minumum amount of digits posible
if (Num < 0)
{
Num *= (-1);
}
for(int i = 10; i <= Num; i*=10)
{
count++;
}
return count;
// this loop will loop until the number "i" is bigger then "Num"
// if "i" is less then "Num" multiply "i" by 10 and increase count
// when the loop ends the number of count is the length of "Num".
}
答案 25 :(得分:-1)
// Variables
long c = 2222882;
long b = c;
float x = 10;
int length = 0;
//Loop to know the length
for(int i = 0; b != 0; i++)
{
b = (float) c / x;
x = x*10;
length++;
}
//Print this one
printf("%i", length);