在C编程中如何计算整数的长度?

在C编程中如何计算整数的长度?,c,C,请告诉我计算整数位数的最简单方法。 场景是,我将从用户那里获取一个长整数的输入。如果整数的长度等于11,则会显示一条消息成功,否则会显示一条错误消息。最后,如果它给出错误信息,我想中断程序,屏幕上不应显示其他指令 到目前为止,我已经用while和if语句尝试了下面的代码,程序确实运行了,但没有给出所需的输出 printf("Enter your Account Number :\n"); scanf("%ld", &accno); while(accno != 0) { ++c

请告诉我计算整数位数的最简单方法。 场景是,我将从用户那里获取一个长整数的输入。如果整数的长度等于11,则会显示一条消息成功,否则会显示一条错误消息。最后,如果它给出错误信息,我想中断程序,屏幕上不应显示其他指令

到目前为止,我已经用while和if语句尝试了下面的代码,程序确实运行了,但没有给出所需的输出

printf("Enter your Account Number :\n");
scanf("%ld", &accno);

while(accno != 0)
{
    ++count;
    }
    count = count;
if (count == 11){
        printf("You are existing customer of bank.");
    }else{
        printf("Sorry you are not a customer of our bank");
    }

方法1:数学

实际上,使用
log
函数(基数10),有一种数学上聪明的方法可以找到任意数字中的位数:

#包括
#包括
int numlen(无符号长n){
如果(n==0)返回1;
return(int)(ceil(log10((double)(n)));//很抱歉出现了多个铸件,因为ceil/log接收和返回都是双倍的
}
这个方法当然比较慢,但它在数学上很漂亮

编辑:我完全同意@chux的意见,即由于铸件和浮点精度问题,这种方法不是整数解决方案的最佳方法。然而,在国际海事组织看来,这仍然是解决这个问题的数学上最合适的方法

方法2:循环

int numlen(unsigned long long n){
    int len = 0;

    if(n<10) return 1;
    while (n) {
        n /= 10;
        len++;
    }
}
int numlen(无符号长n){
int len=0;

如果(n=1000000000&&n
while(accno!=0){++count;}
是一个无限循环
count=count;
。这是什么?
int i=0;while((n/=10)>0)i++;
类似于this@SouravGhosh这是一个众所周知的技术,以防止…的影响,如果你得到了正确的时机,你采取旧的,正确的价值观(
count
)然后在宇宙原始数据改变值后将其分配回原始变量:-)@EugeneSh。您可以选择是优化速度(
-O3
)、大小(
-Os
)还是宇宙射线保护(正在开发的
-Ocrp
)。说得好!已编辑!问题是默认情况下,
log10
接受一个
double
,因此如果您不强制执行castingfacepalms-Edited Thanks,它有时会抛出一个错误。您是否需要关心其他详细信息:
unsigned long n;…(double)(n/*不是x*/)
-->由于
n
为64位,而
double
通常超过54位,因此转换为
9999999999999
unsigned long
时会对大的
n
进行四舍五入。因此
n
转换为
double
时正好变为1.0e+19,然后为1对整数问题使用FP-math往往会遇到许多毫无疑问的极端情况,对于整数问题最好避免。
int numlen(unsigned long long n){
    int len = 0;

    if(n<10) return 1;
    while (n) {
        n /= 10;
        len++;
    }
}
int isElevenDigits(unsigned long long n){
     if(n>=10000000000 && n<=99999999999) return 1;
     else return 0;
}