转化二进制主要有以下几种:正整数转二进制,负整数转二进制,小数转二进制
今天学习整数转化二进制:除二取余,然后倒序排列,高位补零。
我们用计算器验证一下
那么又有新问题了:遇到很大的数字我们也要用手算吗?这未免也太浪费时间了,而且容易出错,我们可不可以用代码来实现这一功能呢?
分析十进制转化的方法,只用到了一个循环,数字N%2(取余),N/2=a(求商),N=a(将a赋给N)
那么什么时候停止呢?由图片1,我们发现当商为0时停止,即N==0时
完成以上工作后我们只需要将余数倒着排列即可。
那么怎么倒着排列呢?我们可以创建一个中间变量i,每循环一次i++,i即为循环次数,也就是二进制位数,我们可以创建一个数组,将余数赋值给arr[i],令i--,打印arr[i]。
#include<stdio.h>
int main()
{
int N = 0;//输入一个正整数N
int i = 0;
int arr[32];
scanf("%d", &N);
while (N != 0)
{
int B = N % 2;
//printf("%d",B);
//将B打印出来是倒的二进制,接下来我们将它倒着打印即可
int a = N / 2;
N = a;
arr[i] = B;
i++;
}
for (; i >= 0; i--)
{
printf("%d", arr[i]);
}
return 0;
}
结果相同,此代码可行
但是有没有更简便的方法呢?
我们可以利用递归,如果数字 N/2>0,我们将N/2 赋值给N,再次进入判断,直到N/2<0,代码如下:
//十进制转换二进制
#include <stdio.h>
void dectobin(int n)
{
if (n / 2 > 0)
{
dectobin(n / 2);
n=n/2;
}
printf("%d", n % 2);
}
int main()
{
int n;
scanf("%d", &n);
dectobin(n);
return 0;
}
练习:我们来看一看十四届蓝桥杯模拟赛第一期的第一个题目
十进制整数 2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数。
十进制整数 22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数。
请问十进制整数 2022 在二进制中是几位数?
相比于打印二进制,我们只需要将它的位数计算出来,简单多了
#include<stdio.h>
int main()
{
int N = 0;
//输入一个十进制N
scanf("%d", &N);
int count = 0;
while (N != 0)
{
int B = N % 2;
int a = N / 2;
N = a;
count++;
}
printf("%d", count);
return 0;
}
确实是11位数,此题解决。