编写一个C程序,该程序计算一个无符号整数值(4个字节)的二进制表示中的1s数



我正在尝试编写一个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 反常,在某些受控的开发环境中,内存为零,您会看到没有错误。然后,您可以可以进行生产计划。该程序将在性能优化的环境中运行,其中内存零不值得麻烦。,该程序将开始始终如一地失败。由于您开始了,因此您不想养成不良习惯。

相关内容

最新更新