之前老师给我们发布了一个作业:
数制转换问题,要求:键盘输入一个十进制数,输出对应的二进制数。如:65--->1000001B。
算法思想:
(1)每个十进制数都是>=2^x && <2^(x+1);可以实现拆分多个2的次方相加。
如:65>2^6 && 65<2^7,65-2^6=1,1=2^0 && 1<2^1。
所以65=2^6+2^0。
再举个例子:8=2^3 && 8<2^4。
所以8=2^4。
scanf_s("%d", &i);//i为输入的十进制数
while (a >0)//设置一个能使2相乘循环的条件
{
a *= 2;
j++;//j为2相乘的次数(2^a)
if ((i >= a) && (i < (a * 2)))
{
i = i - a;
//printf("相减后的余数=%d ", i);
j = 0;//重置j为0,为相减后的i的循环做准备
a = 1;//重置a为1,为相减后的i的循环做准备
}
知道了这个十进制数由哪些2^a相加后,再利用函数传值把他们分别转化为二进制相加
如65=64+1;64的二进制形式为10^6=1000000
31=16+8+4+2+1;16的二进制形式为10^4,8:10^3,4:10^2,2:10^1
int add(int k)
{
int c = 1;
while (k > 0)
{
c = c * 10;
k--;
}
//printf(" 2^a转换为二进制数=%d", c);
return c;
}
因为65=64+1中的1或者31=16+8+4+2+1中的1不能用用上面的函数求得,
我们会发现一个情况啊,当这个十进制数为奇数的时候最终会有一个1,
于是我们为输入的十进制数i加一个判断条件,
if (i % 2 != 0)//如果他是奇数,那么相加的二进制数总和就加一
{
sum += 1;
}
完整代码如下
#include<stdio.h>
int add(int k)
{
int c = 1;
while (k > 0)
{
c = c * 10;
k--;
}
//printf(" 二进制数=%d", c);
return c;
}
int main()
{
int a=1, i,j=0,C,sum=0;
printf("请输入一个十进制数\n");
scanf_s("%d", &i);
if (i % 2 != 0)
{
sum += 1;
}
while (a >0)
{
a *= 2;
j++;
if ((i >= a) && (i < (a * 2)))
{
i = i - a;
//printf("相减后的余数余数=%d ", i);
C = add(j);//函数传值
j = 0;
sum += C;//将循环的二进制数相加
a = 1;
}
}
printf("sum=%dB", sum);//输出最终的二进制数
return 0;
}
感谢你的收看!希望我们一起进步!