制作查找位数的函数

Making a function for finding number of digits

我目前正在学习 CS50 课程,我正在尝试制作一个函数,可以在我输入的数字中给出一些数字。例如,数字 10323 将是 5 位数字。我为此写了一个代码,但它似乎不适用于超过 10 位数字的情况。我能知道这段代码有什么问题吗?

P.S:CS50使用修改后的C语言,适合初学者。语言可能看起来有点不同,但我认为这里的问题在于数学,所以查看我的代码应该没有太大困难?

int digit(int x) //function gives digit of a number
{
    if (x == 0)
    {
    return 0;    
    }
    else
    {
        int dig = 0;
        int n = 1;
        int y;
        do
        {
            y = x / n;
            dig ++;
            n = expo(10,dig);
        }   
        while (y < 0 || y >= 10);
        return dig;
    }
}

您没有提供函数 expo() 的定义,因此无法说明为什么 digit() 函数不起作用。

但是,您正在使用 int 变量。 int类型的大小规格为implementation-dependent。不同的编译器可以有不同大小的整数。根据编译选项,甚至给定的编译器也可以有不同的大小。

如果您的 CS50 class 使用的特定编译器具有 16 位整数(目前不太可能,但理论上可能),这些值将从 0 (0x0000) 到 32767 (0x7FFF),并且然后环绕到 -32768 (0x8000) 到 01 (0xFFFF)。因此,在这种情况下,您的 digit 函数只能处理最多 5 位小数的部分范围。

如果您的编译器使用 32 位整数,那么您的整数将从 0 (0x00000000) 到 2147483647 (0x7FFFFFFF),然后循环到 -2147483648 (0x80000000) 到 -1 (0xFFFFFFFF),因此仅限于 10 位范围的一部分。

我要冒险猜猜你有 32 位整数。

你可以通过在你说 int 的任何地方使用类型 unsigned int 来获得额外的一点。但基本上你会受到编译器和实现的限制。

如果您想获得更大值的小数位数,建议您使用字符串输入而不是数字输入。然后您只需查看字符串的长度。为了获得额外的分数,您还可以去除前导 0,可能会删除前导加号,也可能会在字符串中删除逗号。识别带有意外 non-numeric 字符的无效字符串会很好。但基本上所有这些都取决于学习那些字符串函数。

"while(input>0)
    {
        input=input/10;
        variable++;
    }
    printf("%i\n",variable);"

link对此的输入。