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语言算法之将十进制数转换成二进制数[通俗易懂]

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 实现WORD文档、PDF文档在线预览:具体实现流程

    实现WORD文档、PDF文档在线预览:具体实现流程

  • mongodb与MySQL的不同_Mongodb与MySQL之间的比较分析

    mongodb与MySQL的不同_Mongodb与MySQL之间的比较分析本篇文章给大家带来的内容是关于Mongodb与MySQL之间的比较分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录。也就是说,一个表不能有多个主键,并且主键不能为空值。无论是MongoDB还是MySQL,都存在着主键的定义。对于MongoDB来说,其主键名叫”_id”,在生成数据的时候,如果用户不主…

  • pandas groupby 用法详解

    pandas groupby 用法详解1.分组groupby在日常数据分析过程中,经常有分组的需求。具体来说,就是根据一个或者多个字段,将数据划分为不同的组,然后进行进一步分析,比如求分组的数量,分组内的最大值最小值平均值等。在sql中,就是大名鼎鼎的groupby操作。pandas中,也有对应的groupby操作,下面我们就来看看pandas中的groupby怎么使用。2.groupby的数据结构首先我们看如下代码defddd():levels=[“L1″,”L1″,”L1″,”L2″,”L2″,”L3”,

  • ai修复照片软件是哪个软件_AI照片修复免费版-AI照片修复软件下载v1.1.0安卓版-西西软件下载…「建议收藏」

    ai修复照片软件是哪个软件_AI照片修复免费版-AI照片修复软件下载v1.1.0安卓版-西西软件下载…「建议收藏」AI照片修复软件是一款专业的照片图片修复处理工具,可以帮助用户将旧照片、老照片以及低像素的照片进行修复,软件界面赶紧操作简单,适合没有经验的伙伴修复使用,除此之外,还有各种美化效果,轻松将照片上色、换底、换像素,来西西下载即可使用哦!AI照片修复软件简介:AI照片修复是一款免费的智能AI照片修复处理工具,包括照片破损修复、黑白照片上色、无损放大、模糊照片清晰增强等实用工具。基于先进的AI图像生成技…

  • (一)activiti学习笔记

    (一)activiti学习笔记

  • springboot+redis+jedis实现分布式锁小Demo

    springboot+redis+jedis实现分布式锁小Demo

发表回复

您的电子邮箱地址不会被公开。

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