问题C:进制转换

时间限制 内存限制
1.000sec 32MB

题目描述:

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

输入:

多组数据,每行为一个长度不超过30位的十进制非负整数。(注意是10进制数字的个数可能有30个,而非30bits的整数 ,输入可能有多行)

输出:

每行输出对应的二进制数。

样例输入:
 9852111126
样例输出:
 11110110011101001110001100110

分析:
    首先我们知道:一般的整数的取值范围如下:

类型 取值范围
int && long -2147483648 ~ +2147483647
long long -9223372036854775808 ~ +9223372036854775807

1.对于无符号型的整数,在原有的正的取值范围基础上扩大一倍即可。因此我们没法直接用整形变量来储存题目中给的数据。所以在此我们采用 数组 的形式来储存数据(先用char 类型数组读入数据,然后将数据对应转换到int型数组中,然后处理int 型数组即可):

2.对于 int 型数组中的数据我们要怎么处理才能将其转变为二进制的呢?我们来看一个例子:

    3.显然上图就是我们对于已知的十进制数字转换成二进制的过程,结果倒序输出:50对应的二进制数即为 110010;现在对于这道题目来说,我们将数值存在了数组中那么50在数组中的形式为:{5 , 0}。我们没法用直接除的方法来解决。但我们可以这样来思考:
        3.1 因为我们十进制转二进制,对数值进行处理的过程大概如下:


50 % 2 = 0;然后将0记下,并将操作的数据除以2:50 / 2 = 25;
再:25 % 2 = 1;将1记下,将操作的数字除以2:25 / 2 = 12;
......
直到操作数等于0的时候停止,倒序输出记下的数就是我们求的二进制的数。

3.2 显然,在这个过程中,需要知道的数据就是我们的:操作数转换的进制数每一轮的余数 。因为被操作数每一轮发生一次变化,并且每次操作后就变小,所以,我们可以用原来操作数占用的数组空间来储存变化后的操作数(50 变为 25 再变为 12 …我们只需改变数组中的值即可),我们都用数组 num_int 来表示
        3.3 要转换的进制数显然是2,那么每一轮的余数怎么算?。这里就需要回到我们小学三年级学的除法上了(竖式计算除法),哈哈:

3.3.1 我们要计算 12 9 10 129_{10} 12910​ 的二进制数:

首先:取出最高项1作为被除数,除以二显然不够除,我们写0在商上面。
然后:将2拉下来,这样我们的被除数就变为了1 × 10 + 2 = 12,接着用被除数除以2:12 ÷ 2 = 6,所以将6写在商0的后面。我们的商就变为了 06;被除数变为了 12 % 2 = 0;
最后:将最后一项9拉下来作为被除数,被除数变为0 * 10 + 9 = 9,接着9/2 = 4;余下1,将4写在商的位置,我们的商就是064 , 余数是1;我们得到:129 ÷ 2 = 64 ······ 1我们下轮用到的就是商 64 ,对64 做相同的处理,那么余数1,会被记住 , 继续处理商64.....直到商变为0为止 , 按顺序记录下所有的余数,最后倒序输出所有的余数就是我们要的结果。

过程如下图(字体不好,哈哈):

显然,我们可以看出,每次处理完一位数字后,我们都会用到上一次剩余的结果 temp_before, 并将 temp_before ×10 + 这次要处理的那一位数字 (上图的 1 × 10 + 2 和 0 × 10 + 9就是这个道理),现在我们就明白了:

 处理int型数组中的数字,和小学除法一样,我们要先从最高位开始 逐位处理!

所以,我们需要一个整形变量,temp 从最高位开始来储存每一位上的数字,需要一个整型变量 temp_before 来储存上次操作后的(模除)结果,进行一下循环即可。

while((num_int数组非零)){int temp_before = 0;   //刚开始“上一步”剩余的数是0;for(int i = 0 ; i < num_int数组的长度 ; i++){int temp = (num_int[i] + 10 * temp_before);num_int[i] = (num_int[i] + 10 * temp_before) / 2;temp_before = temp % 2;  //这一次模除的值(余数)留给下一次处理。}可以将余数temp_before储存到新整形数组中或者一个堆栈中。数组中最后倒序输出,堆栈中最后出栈即可。因为此题目中的 模除2  的余数,肯定只能取 0 或 1 ,所以两种方法都可以。
}

AC代码如下:

#include<bits/stdc++.h>using namespace std;int isEmpty(int num[] , int length){for(int i = 0 ; i < length ; i++){if(num[i] != 0)return 0; //返回0代表有非零值。 }return 1;         //返回1代表所有的数据处理好了
}int main(){int result[200] , count = 0;   //存放余数(结果),count 来计结果数目   int num_int[31];    //存放系统给出的数据char num_char[31];   //接受输入数据while(scanf("%s" , num_char) != EOF){count = 0;     //对于一个新数,count要清零。 int length = strlen(num_char);   //存放输入的数字个数 for(int i = 0 ; i < length ; i++){num_int[i] = num_char[i] - '0';      //将char类型的数据改为int类型的 }if(isEmpty(num_int , length) == 1){printf("0");   //对于输入全为0的处理,直接输出0就好}while(isEmpty(num_int , length) == 0){    //不全为空,就是没处理好 ,继续处理 int temp_before = 0; //刚开始“上一步”剩余的数是0;for(int i = 0 ; i < length; i++){int temp = (num_int[i] + 10 * temp_before);num_int[i] = (num_int[i] + 10 * temp_before) / 2;temp_before = temp % 2; //这一次模除的值(余数)留给下一次处理。}result[count++] = temp_before; }for(int i = count - 1 ; i > -1 ; i--){printf("%d" , result[i]);}printf("\n");}
}

表达不太好,感谢阅读。

超大数据10进制转2进制详解(可推广到其他进制)/ Codeup 100000579 问题 C: 进制转换相关推荐

  1. 联盟手游服务器维护中怎么办,移动联盟手游进不去很卡怎么办?移动联盟进不去很卡问题详解[图]...

    类型:角色扮演 大小:1125.85MB 评分:9.9 平台: 移动联盟手游进不去很卡怎么办?下面是友情MT为大家带来的移动联盟手游进不去很卡问题详解,希望能帮助到大家! 移动联盟手游进不去很卡怎么办 ...

  2. W ndows7怎么进入BlOS,Windows7旗舰版进不了bios界面的详解教程

    最近,一些Win7用户安装了Win7旗舰版之后,发现进入不了bios界面,这个问题该怎么解决呢?有什么方法可以解决这个故障呢?下面,U大侠小编就给大家介绍下Windows7旗舰版进不了bios界面的详 ...

  3. Clickhouse的数据存储原理、二进制文件内容分析与索引详解

    Clickhouse的数据存储原理.二进制文件内容分析与索引详解 Clickhouse以其强大的性能著称,已经被越来越多的使用在OLAP分析查询等场景中.Clickhouse是一个列式存储的数据库,而 ...

  4. STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解

    STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解 上一次我们讲了OneNet平台的注册,这次我们来讲一下MQTT的常用报文用法 上一篇地址https ...

  5. 全民大数据时代已来 阿里数加平台详解

    文章讲的是全民大数据时代已来 阿里数加平台详解,业界流行一种说法,云计算与大数据就是一枚硬币的两面,相生相惜,不可分割.在当下互联网时代,数据的价值越来越受到社会的认可,并在今天,已然成为一种普惠资源 ...

  6. pandas数据索引之loc、iloc、ix详解及实例

    pandas数据索引之loc.iloc.ix详解及实例 先来个总结: loc函数:通过行索引 "Index" 中的具体值来取行数据(如取"Index"为&quo ...

  7. ant如何形成时间轴和图库_Python数据可视化常用4大绘图库原理详解_python

    这篇文章主要介绍了Python数据可视化常用4大绘图库原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天我们就用一篇文章,带大家梳理mat ...

  8. 王牌竞速安装后显示服务器维护,王牌竞速服务器进不了 服务器登录问题详解...

    不少玩家在游玩游戏的时候,出现王牌竞速服务器进不了的情况,那么我们此时该如何解决呢?下面我们就一起来看一下王牌竞速服务器问题详解吧. 维护更新 王牌竞速如果在维护和更新期间,我们是无法登录服务器进行游 ...

  9. javacv开发详解补充篇:解决转流后视频画面快进慢放,时间跳动过大,监控视频时间戳重新计算pts和dts

    javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 本篇文章主要用于javacv重新计算pts和dts时间戳. 解决由于没有pts和dts时间戳或者pts和dts时 ...

  10. 去除html标签 express,详解Express条记之静态衬着HTML(新脚进坑)

    在日常项目中,我喜欢用Django做后端, 因为大而全 如果只是写一个简单服务的话, Express是更好的选择, Express是基于nodejs的一个后端框架,特点是简单,轻量, 容易搭建, 而且 ...

最新文章

  1. Y15BeTa蜂鸣器唱歌程序-演奏版
  2. [数据库基础]——索引详解
  3. spring security源码分析之core包
  4. Log4j 日志详细用法
  5. ptcms精美小说阅读网站源码(带采集规则)
  6. python获取a股报表数据_python获取A股基础数据
  7. linux搭建git服务
  8. 一款漂亮的Bootstrap模板INSPINIA_adminV2.5 ---- 20161102
  9. 详解Python函数如何重载?
  10. exFAT硬盘写保护修复远程登录提示到期
  11. 离谱!程序员业余时间开发的项目,版权也属于公司的?
  12. Kubernetes(14):cordon暂停调度/uncordon恢复调度/drain驱逐
  13. Android加固与脱壳分析
  14. pipe()函数详解
  15. 代码实现矩阵求逆的三种方式(超详细、已实现)
  16. 高效实现统计分析(按日,月,周)查询功能
  17. office word安装mathtype报错,找不到mathpage.WLL文件
  18. 解决系统提示:内存不能为“read”或written的办法
  19. 朱棣文2009年哈佛大学演讲:未来并非在劫难逃
  20. 财务软件哪个好?便宜好用的财务软件有哪些?

热门文章

  1. 带标签的infogan及其代码解析
  2. IDEA配置Cplex
  3. 神经网络——机器学习基础
  4. day inset_SetIP三星网络打印IP设置软件
  5. 函数对称性常见公式_三角函数的对称性公式大全
  6. win 10系统搜索计算机,win10系统查找计算器的解决教程
  7. 【ureport2 vue版本实现】
  8. 编译安装redis6.2.6
  9. Firefly-RK3399安装环境
  10. mac常用快捷键--在摸爬滚打中熟练