制作查找位数的函数
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对此的输入。
我目前正在学习 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对此的输入。