数制转换问题,要求:键盘输入一个十进制数,输出对应的二进制数c/c++

之前老师给我们发布了一个作业:

数制转换问题,要求:键盘输入一个十进制数,输出对应的二进制数。如: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;
}

感谢你的收看!希望我们一起进步!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值