我们要打印打一个整数的二进制序列时,加入我们要打印的数是10,那么输出的二进制序列应该是1010,那么我们来看一下下面代码的一个输出结果
方法一:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while (n)
{
printf("%d ", n % 2);
n = n / 2;
}
return 0;
}
结果却是0101!!!
输出的数字是对的,不过输出的位置并不是我们期望的那样,如果能将上面的输出倒序打印出来就好了,所以我们就可以先用一个数组来存放 ,然后再倒序打印出来
#include <stdio.h>
int main()
{
int arr[32] = { 0 };
int n = 0;
scanf("%d", &n);
int i = 0;
for (i = 0; i < 32; i++)
{
arr[i] = n % 2;
n = n / 2;
}
for (i = 31; i >= 0; i--)
{
printf("%d ", arr[i]);
}
return 0;
}
此时的输出结果就是我们想要的一种结果了
上述代码虽然实现了我们的功能,但还是在循环时有缺陷,就是当n为0时,后面的循环就没必要去进行了,所以我们可以对上面的代码进行一个优化
优化后的代码:
for (i = 0; i < 32; i++)
{
if(n == 0)
break;
arr[i] = n % 2;
n = n / 2;
}
加入一个if语句就能很好的去解决这个问题了,避免了多余的for循环
方法二:
方法二就是来利用我们的递归去实现
void Fand(int n)
{
if (n)
{
Fand(n / 2);
printf("%d ", n % 2);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
Fand(n);
return 0;
}
运行结果:
这里递归算法的缺点就是无法将32位全部打印出来