我正在尝试编写一个C程序,该程序将计算用户选择和输入的整数的任何二进制表示中的所有1s数。然后,我想打印1秒的总数。但是首先,我必须检查以确保输入的数字是整数。我的代码:
#include <stdio.h>
int main() {
int num;
int count;
float input;
printf("Please enter an integer: ");
scanf("%f", &input);
num = (int)input;
if (num == input) {
while (num > 0) {
count += num & 1;
num >>= 1;
printf("%d", &count);
}
} else {
printf("Warning: this is not a valid integer.");
}
return 0;
}
运行代码时,我可以输入我选择的整数,但是我得到的输出说:134148802013414880201341488020
或类似的内容。我直到最近才开始使用C进行编码,所以我不确定这是什么意思或我的代码出错的位置。
您的代码中存在问题:
- 您不应将数字读为
float
,而是将大于23位的数字的精确度。 -
count
是未初始化的。即使只是增加它的行为。 - 循环结束后,您应该用
printf("%dn", count);
打印位数。您当前使用此类型的无效的转换指定符打印count
的地址。
这是一个更正的版本:
#include <stdio.h>
int main(void) {
unsigned int num;
printf("Please enter an integer: ");
if (scanf("%u", &num) == 1) {
int count = 0;
while (num > 0) {
count += num & 1;
num >>= 1;
}
printf("%dn", count);
} else {
printf("Warning: this is not a valid integern");
}
return 0;
}
注意:
- 该程序仅限于
UINT_MAX
以下的数字,通常是当前系统上的4294967295
。将以定义的实现方式处理较大的数字。 - 有更复杂的方法来计算整数中的1位数量。您可以在这里了解这些:https://graphics.stanford.edu/~seander/bithacks.html#countbitssetnenaive
您的 count
变量未初始化,因此它可以从随机 1 的任何值开始。总是初始化您的变量:
int count = 0;
然后,当您打印它时,打印了错误的东西 - 一个指针来计数而不是计数本身,并且没有运输返回,因此您将其全部列入一条线:如果数字正确,您会得到一个" 12345"或" 11122234445"的单一问题。
printf("Count is now is %dn", count);
我强烈建议您打开编译器的所有警告 - 这会警告您一个非初始化的变量,几乎可以肯定的是,%d和for to and of the的差异(也许您缺少的事实包括printf
)
1 反常,在某些受控的开发环境中,内存为零,您会看到没有错误。然后,您可以可以进行生产计划。该程序将在性能优化的环境中运行,其中内存零不值得麻烦。,该程序将开始始终如一地失败。由于您开始了,因此您不想养成不良习惯。