10进制数转换为16位二进制数

写在前面:

题解是对具体题目的编程实现,不会具体讲解C语言语法。请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~)。在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以在教材或其他学习资源找到这些内容学习。😀


 本题的预备知识:

  • 变量的定义与赋值操作
  • 输入(scanf)输出(printf)语句 
  • for、while循环语句
  • 数组的运用

 

10进制数转换为16位二进制数

成绩10开启时间2020年03月28日 星期六 08:00
折扣0.8折扣时间2020年04月20日 星期一 23:00
允许迟交关闭时间2020年04月30日 星期四 23:00

将任一正整数(<65536)转换为 16 位二进制形式。

输入: 正整数

输出: 正整数的 16 位二进制数

友情提示:定义一个整型数组,数组有16个元素,保存变换后的二进制数。

 测试输入期待的输出时间限制内存限制额外进程
测试用例 1 
  1. 144↵
 
  1. 0000000010010000↵
1秒64M0

题解

本题给出两种解法:

方法一

初中学过,根据对2的求模取余法,可以将一个十进制数转化为二进制数。只是要注意,先求取出来的余数应该在后,后求取出来的余数应该在前。且本题需要输出一个16位的结果,所以不足的高位应该补上0。那我们可以定义一个数组a,将其内容全部初始化为0,然后从第一位来依次存储余数。只是,最终的输出应该是逆序的!

比较简单,直接上代码了:

#include <stdio.h>   //导入stdio.h库,里面包含输入输出函数

int main() {
    int num;
    scanf("%d", &num); //以十进制的形式输入一个整数,存在num内

    int a[16] = {0};  //定义一个长度为16的数组a,并全都初始化为0
    int i = 0;

    /* 求模取余法 */
    while (num != 0) {
        a[i] = num % 2;  //存入余数
        num /= 2;  //取商继续算
        i++;
    }
    /* 倒序处处16位数字 */
    for(i = 15; i >= 0; i--)
        printf("%d", a[i]);
    printf("\n");
}

关于数组的初始化有一些要注意,在 画一个字母组成的菱形 中的最后有提示,可以看看。


方法二

在 stdlib.h 库中有一个函数叫 itoa(Integer to array)。功能是将一个数字按照规定的格式转换为字符串,具体操作如下:

//将一个值为value的整数,转变为进制是radix的数,并存储在字符串数组s中
itoa(value, s, radix);

那么我们可以直接调用这一函数来实现进制转换,在输出字符串之前补上零即可。至于要补上多少位0,我们需要知道转化成二进制后字符串的长度,可以调用 string.h 库中的 strlen 函数求字符串s的长度,即元素个数,最终我们应该在输出s前输出 16 - strlen(s) 个0。

实现代码如下: 

#include <stdio.h>   //导入stdio.h库,里面包含输入输出函数
#include <stdlib.h> //导入stdlib.h库,里面包含itoa函数
#include <string.h> //导入string.h库,里面包含strlen函数

int main() {
    int num;
    scanf("%d", &num); //以十进制的形式输入一个整数,存在num内

    char s[16];
    itoa(num, s, 2);  //将num转化为二进制数并存储在字符串s中
    /* 输出 16 - strlen(s) 个0 */
    for(int i = 0; i < 16 - strlen(s); i++)  
        printf("0");
    printf("%s", s);
}

一点补充

不知道你是否还记得,之前学 printf 的时候,其格式符中有一部分是与进制有关的。下面我把它列举出来:

符号含义
%d / %i按有符号的十进制整数格式输出
%u 按无符号的十进制整数格式输出an
%x / %X

按有符号的十六进制整数格式输出

%o按有符号的八进制整数格式输出

使用方法如下图例: 

int num = 114;
printf("%d", num);  //输出num的10进制值
printf("%o", num); //输出num的8进制值
printf("%x", num);  //输出num的16进制值

可以看出,让我们需要将十进制转化为八进制、十六进制输出的时候是很简单的,printf函数就能帮我们直接实现,但是遗憾的是并没有二进制的输出格式符,所以本题需要手算或者调用itoa函数实现。



有任何问题欢迎评论交流,如果本文对您有帮助不妨点点赞,嘻嘻~ 


end 

欢迎关注个人公众号 鸡翅编程 ”,这里是认真且乖巧的码农一枚。

---- 做最乖巧的博客er,做最扎实的程序员 ----

旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

在这里插入图片描述

 

  • 1
    点赞
  • 14
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

贝贝今天AC了吗

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值