求解!为什么输出的是1100而不是0011呢?


#include <stdio.h>
void Bin(int x)
{
    if (x/2 > 0) Bin(x/2);
    printf("%d\n", x%2);
}

int main()
{
    Bin(12);
    return 0;
}

这段程序的输出结果为:

1
1
0
0

解释如下:

该程序使用递归实现了一个将十进制数转换为二进制数的函数。首先从参数 x 的最高位开始,将其依次除以 2 并取余数,直到商为 0。每一个余数都会被打印出来,正好对应着二进制数的每一位数字。因此,参数 12 对应的二进制数为 1100,所以程序的输出结果为 1、1、0、0,每个数字占一行。

递归调用分别是 Bin(6)、Bin(3)、Bin(1)、Bin(0),其中 Bin(0) 是递归的终止条件。当参数值小于等于 0 时不再递归,直接返回上一层,并按照先前计算的顺序依次输出余数(即对应二进制数的每一位数字)。

因为是先递归再输出的,依次执行 Bin(12) Bin(6) Bin(3) Bin(1) ,递归完之后,倒叙输出 1100
,如果是输出在最前面就是0011 ,比如下面这样
printf("%d\n", x%2);
if (x/2 > 0) Bin(x/2);

因为是先递归,后打印
要从最后一次递归的函数开始打印,一层一层退回来,退回来一层打印一个
你想正序打印就把print写在递归之前
想倒序打印就把print写在递归之后

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/751323
  • 这篇博客也不错, 你可以看下计算1000!末尾含有多少个0(循环)
  • 以下回答来自chatgpt:

    根据参考资料,这个问题与输出二进制数0011无关。题目中没有提到任何与二进制数有关的操作,所以可能存在误解。在堆结构中,可能会通过一些算法将输入的数据插入堆中,这个算法中会对插入的数据进行向上调整,即通过与父亲结点的比较将插入的结点放到能使整个堆满足大堆特性的位置。因此会出现插入某个数后,输出的结果和预期不一致的情况。但具体原因需要具体分析代码和数据,无法直接通过这个问题描述判断出问题的具体原因。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^