C语言算法之将十进制数转换成二进制数[通俗易懂]

C语言算法之将十进制数转换成二进制数[通俗易懂]导语:在C语言中没有将其他进制的数直接输出为二进制数的工具或方法,输出为八进制数可以用%o,输出为十六进制可以用%x,输出为二进制就要我们自行解决了。下面给大家讲述一下如何编程实现将十进制数转换成二进制数。先将源代码展示给大家:#include<stdio.h>voidmain(){//进制转换函数的声明inttransfer(intx)…

大家好,又见面了,我是你们的朋友全栈君。

导语:在C语言中没有将其他进制的数直接输出为二进制数的工具或方法,输出为八进制数可以用%o,输出为十六进制可以用%x,输出为二进制就要我们自行解决了。下面给大家讲述一下如何编程实现将十进制数转换成二进制数。

原文的实现方式太年轻了,是我大一的时候写的。由于太多小伙伴被『溢出』困扰(在溢出的情况下原文的实现就不灵了),补充下面这种最佳的实现方式。

最佳的方式是利用栈先进后出的特性,计算每一位(0或1)压入栈中,再将所有元素出栈得到的01串就是目标二进制数。以下为C++实现代码,想用C语言实现的可以进行相应的改造,用数组实现一个栈,用字符数组实现字符串。

#include <iostream>
#include <stack>

using namespace std;

string transfer(int x) {
    if (x == 0) {
        return "0";
    }
    string ret;
    stack<char> st;
    while (x > 0) {
        if (x % 2 == 1) {
            st.push('1');
        } else {
            st.push('0');
        }
        x /= 2;
    }
    while (!st.empty()) {
        ret.push_back(st.top());
        st.pop();
    }
    return ret;
}

int main() {
    int x;
    cin >> x;
    cout << transfer(x) << endl;
    return 0;
}

下面是大一时候的实现,没有考虑溢出的问题,对于不懂栈的同学可以看一下。

先将源代码展示给大家:

#include <stdio.h>
void main()
{
    //进制转换函数的声明
    int transfer(int x);
    int x;
    printf("请输入一个十进制数:");
    scanf("%d",&x);
    printf("转换成二进制数是:%d\n",transfer(x));
}
int transfer(int x)
{
    int p=1,y=0,yushu;
    while(1)
    {
        yushu=x%2;
        x/=2;
        y+=yushu*p;
        p*=10;
        if(x<2)
        {
            y+=x*p;
            break;
        }
    }
    return y;
}

具体算法体现在函数体内,使用了一个while(1)的死循环,当结果产生后跳出循环。变量yushu是每一次循环内产生的余数,变量x每次循环都会被赋予新的值,这个新的值就是每一次循环内产生的商。当产生的商小于2时即产生了最后的结果(二进制数),然后跳出循环。

例如:函数自变量若为7,用自变量7除以2,得到第一次循环产生的余数为1,第一次循环产生的商为3;用第一次循环产生的商3除以2,得到第二次循环产生的余数为1,第二次循环产生的商为1。

变量y的存放也是有一定技巧的,由于每次产生的余数都小于2并且都是最后二进制数中需要按位展现出来的,因此每一次循环产生的余数都要合理地进行存放。第一次产生的余数放在个位,第二次产生的余数放在十位,第三次产生的余数放在百位……依次类推,直至某一次循环产生的商小于2,最后再把小于2的那个商放在最高位。变量p的作用就是控制位数,变量y的初始值定为0,变量p的初始值定为1,每次循环内变量p都自乘10,每次循环内都让变量y加上yushu*p,这样就实现了余数的按位存放。最后将小于2的那个商乘以p加到变量y中,得到最后的二进制数。

例如:还是以自变量7为例,第一次循环后y的值为1,第二次循环内if语句之前y的值为11,if语句内y的值变为111,111即为7的二进制数。

注意:变量p的自乘要放在变量y加上yushu*p之后!顺序不能颠倒!

欢迎大家关注/订阅我的微信公众号Code Art Online,我会在我的公众号分享个人见闻,发现生活趣味;这里不仅有0和1,还有是诗和远方↓↓↓

C语言算法之将十进制数转换成二进制数[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144527.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月19日 下午12:20
下一篇 2022年5月19日 下午12:40


相关推荐

  • SecGPT-14B镜像免配置教程:Supervisor守护下的vLLM+Gradio高可用部署

    SecGPT-14B镜像免配置教程:Supervisor守护下的vLLM+Gradio高可用部署

    2026年3月14日
    2
  • LoadRunner教程(1)-LoadRunner简介与安装

    LoadRunner教程(1)-LoadRunner简介与安装LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。LoadRunner可适用于各种体系架构的自动负载测试,能预测系统行为并评估系统性能。下载及其安装过程参照如下,记住安装成英文…

    2022年5月23日
    42
  • orcle排序

    orcle排序一 DECODE 不规则排序 nbsp 主要作用 将查询结果翻译成其他值 1 数据库存序号 按中文拼音排序 publicstatic 币别 0 进出口口岸 1 目的港 2 运输方式 3 运输工具 国别地区 5 贸易方式 收汇方式 费用类别 验收方式 成交方式 10 险别 银行交单类型 经营单位 单位编码 境内货源地

    2026年3月19日
    2
  • 3步配置,1分钟上手!WPS接入DeepSeek,办公效率飙升300%!!!

    3步配置,1分钟上手!WPS接入DeepSeek,办公效率飙升300%!!!

    2026年3月16日
    2
  • Matlab画图线型、符号及颜色设置

    Matlab画图线型、符号及颜色设置在matlab中线条的属性主要有:Color:颜色LineStyle:线型LineWidth:线宽Marker:标记点的形状MarkerFaceColor:标记点填充颜色MarkerEdgeColor:标记点边缘颜色MarkerSize:标记点大小举例x=[-2*pi:0.01:2*pi];y1=sin(x);y2=cos(x);figure;%打开一个画板%画两条线,返回的是这两条线的句柄,h是一个包含两个句柄的数组h=plo

    2022年5月31日
    44
  • python画图小代码

    python画图小代码奥运五环importturtlet=turtle.Pen()t.speed(1)#画笔颜色为蓝色t.pencolor(“blue”)#画笔宽度为8t.pensize(8)#画半径为60的圆,篮圈t.circle(60)#第一个环t.penup()t.goto(100,0)t.pendown()设置环的颜色t.pencolor(“black”)t.circle(60)#第二个环t.penup()t.goto(200,0)t.pendown()t.pen

    2022年5月17日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号