当我使用 1 位数字时,此代码正确地 运行。但它一直落后于更多的数字

This code is running properly when I use 1 digit numbers. But It's keep lagging on more digit numbers

出了点问题。我正在尝试制作一个可以计算任何自然数的数字的 cade。就像 2 的计数是 1,30 是 2,456 是 3。我的代码是 运行 用于 1 位数字而不是两位数。

#include<stdio.h>
void main(void)
{
    int num,count,check;
    float div;
    printf("Enter a natural number\n");
    scanf("%d", &num);

    while (num<=0)
    {
        printf("Error\n");
        printf("Enter a number\n");
        scanf("%d", &num);        
    }

    while(num>1)
    { 
        count=1;
        check=10;
        div=num/check;

        if(div<=1)
        {
            printf("Number count is\n%d", count);
            break;
        }
        check = check*10;
        count = count+1;
    }
}

你的解决方案的问题是,在循环结束时修改checkcount后,它们被重新声明为110分别在每个段落的循环开始处。
您需要将声明移到 while 循环之前。
另外 div 不需要是 float,因为这个数字的小数部分是无关紧要的。
您还可以通过将 check 替换为 10 和 直接使用 num 而不是将结果临时存储在 div.

我认为这可能是一个更简单的解决方案

#include <stdio.h>

int main(){
    int num = 0, digits = 0;

    while (num <= 0)
    {
        printf("Enter a natural number\n");
        scanf("%d", &num);
        num == 0 ? printf("Error\n") : 0;
    }

    for( ; num > 0; digits++)
        num /= 10;
    printf("number of digits: %d\n", digits);
}

随着 num 连续除以 10,结果的小数点被截断,因为 num 是一个 intdigits 稳步增加。

是时候学习使用调试器了。使用它会立即显示代码中的主要问题:您在循环中重置 countcheck 的值 。因此,如果您输入一个大于或等于 10 的数字,您将进入一个无限循环,因为您将始终将该数字除以 10,并发现结果 >= 1!

还有一个不太重要的问题:你用了if(div<=1),而它应该是if(div<1)。因为 10/10 1 并且有 2 个数字...

完成这些修复后,您应该:

    ...
    check = 10;
    count = 1;
    while (num > 1)
    {
        div = num / check;

        if (div < 1)
        {
            printf("Number count is\n%d", count);
            break;
        }
        check = check * 10;
        count = count + 1;
    }
    return 0; // main shall return an int value to its environment...
}

正确给出正整数的小数位数。但是正如您在评论中所说,您应该 始终 测试 scanf 的 return 值(用户无意中输入的是什么 t 而不是 5 例如?)。

话虽如此,这个答案旨在向您展示问题所在,但 Keyne 的解决方案更好...