Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算给定正数的总位数,而不在C中循环_C - Fatal编程技术网

计算给定正数的总位数,而不在C中循环

计算给定正数的总位数,而不在C中循环,c,C,如何计算给定正数的总位数而不在C中循环?对于整数,取数字的log10,向下取整,然后加一 测试: #include <math.h> #include <stdio.h> int num_digits(unsigned long number) { return (int)(floor(log10((double)number)) + 1.0); } int main(int argc, char **argv) { unsigned long te

如何计算给定正数的总位数而不在C中循环?

对于整数,取数字的log10,向下取整,然后加一

测试:

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

int 
num_digits(unsigned long number)
{
    return (int)(floor(log10((double)number)) + 1.0);
}

int
main(int argc, char **argv)
{
    unsigned long test_numbers[] = {
        1, 9, 10, 99, 100, 999, 1000, 9999, 10000, 99999, 100000, 999999,
        123456789ul,
        999999999ul,
        0
    };

    unsigned long *ptr;
    for(ptr = test_numbers; *ptr; ptr++)
    {
        printf("Number of digits in %lu: %d\n", *ptr, num_digits(*ptr));
    }

    return 0;
}
两个解决方案

int digit_count(unsigned int n)
{
   if (n < 10)
      return 1;
   else
      return (1 + digit_count(n / 10));
}
int位数\u计数(无符号整数n)
{
如果(n<10)
返回1;
其他的
返回值(1+数字_计数(n/10));
}

无符号整数n=50;
int i=0;
乱劈:
i++;
如果(n<10)
{
printf(“数字:%d\n”,i);
}
其他的
{
n/=10;
转投黑客;
}

不要因为最后一个问题而恨我:(

一个可能的解决方案,假设16位整数值和逻辑表达式的值为0或1。如果担心可移植性,可以用
(u>99)?1:0
替换这些条件

int digits( unsigned u)
{
    return 1 + (u > 9) + (u > 99) + (u > 999) + (u > 9999);
}

返回snprintf(0,0,“%d”,num);

这是一个非常繁琐的问题(尤其是“不使用构造”部分)你最好解释你为什么要这么做。这是家庭作业吗?面试问题?最后,在什么基础上?如果你不能使用循环,你能使用数学吗?递归怎么样?另外,如果这个问题是家庭作业,它应该被标记为家庭作业。什么样的数字?双精度,浮点,32位整数?有符号还是无符号?“没有循环”应该包括“goto”的用法。现在大家都讨厌你;-)好吧,“goto”可以用于多种用途,包括但不限于循环;)GOTO是邪恶的,但我喜欢“HACK”的用法。从技术上讲,第一个也一样——递归在数学上等同于循环。这完全取决于你想使用什么样的“循环”定义。这是临时的吗?或者,如果一个哨兵案件还没有得到满足,是否有任何构造会重复一个动作?@Shravan:这正是我称之为“黑客”的原因:-韦恩·沃纳-因为OP不够清楚,我只是认为他是为了避免典型的“while”,“for”,“for…”你确定这是足够精确的,并且没有给一些999的错误答案。。。数字?@starblue:您不能完全确定基于C标准,因为它没有指定日志函数的精度或类型的宽度。但是,如果“给定正数”是32位整数,并且日志是在IEEE double中完成的,那么精度就足够了。准确度可能不高。
   unsigned int n = 50;
   int i = 0;

HACK:
   i++;

   if (n < 10)
   {
      printf("Digits: %d\n", i);
   }
   else
   {
      n /= 10;

      goto HACK;
   }
int digits( unsigned u)
{
    return 1 + (u > 9) + (u > 99) + (u > 999) + (u > 9999);
}