【问题标题】:How to calculate length of an integer in C Programming? [closed]如何在 C 编程中计算整数的长度? [关闭]
【发布时间】:2019-09-02 05:31:21
【问题描述】:

请告诉我计算整数位数的最简单方法。 场景是我将从用户那里获取一个长整数的输入。如果整数的长度等于 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");
    }

【问题讨论】:

  • while(accno != 0) { ++count; } 是一个无限循环
  • count = count;..这是什么?
  • int i=0; while((n/=10)>0) i++; 这样的东西
  • @SouravGhosh 这是一种众所周知的技术来防止Cosmic Rays 的影响......如果你得到正确的时机,你会采用旧的,正确的值(count)然后分配它回到原来的变量就在一个宇宙原始变量改变了值:-)
  • @EugeneSh。您可以选择是优化速度 (-O3)、尺寸 (-Os)还是宇宙射线防护(开发中的@ 987654329@).

标签: c


【解决方案1】:

方法一:数学

使用log 函数(以 10 为基数)实际上有一种数学上的智能方法来查找任意数字的位数:

#include<stdio.h>
#include<math.h>

int numlen(unsigned long long n){
     if(n==0) return 1;
    return (int)(ceil(log10((double)(n)))); //sorry for the multiple castings, as ceil/log both take in and return doubles
}

这种方法当然比较慢,但是在数学上很漂亮。

编辑:我完全同意@chux 的评论,即由于铸件和浮点精度问题,这种方法对于整数解决方案来说并不是最可取的。但是,它仍然是解决问题的最合适的数学方法,imo。

方法2:循环

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

    if(n<10) return 1;
    while (n) {
        n /= 10;
        len++;
    }
}

方法三:递归

关于基于递归的答案,请参阅@Rutendo 答案

方法四:检查一下? (仅限您的申请) 由于您只需要一种方法来检查数字是否为 11 位长,因此只需检查整数是否介于 10000000000 和 99999999999 之间。

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

【讨论】:

  • 好点!已编辑!
  • 问题是log10默认接受double,所以有时候不强制转换会报错
  • facepalms - 编辑感谢
  • 您是否应该关心其他细节:unsigned long long n; ... (double)(n /* not x */) --> 转换为 double 会导致大 n 舍入,因为 n 是 64 位,而 double 通常超过 54 位回合。所以9,999,999,999,999,999,999unsigned long long 完全一样,但是当转换为double 时,它正好变成1.0e+19,然后在这个任务中被关闭1。将 FP 数学用于整数问题往往会遇到许多毫无防备的极端情况,最好避免用于整数问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
相关资源
最近更新 更多