超大数据10进制转2进制详解(可推广到其他进制)/ Codeup 100000579 问题 C: 进制转换
问题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: 进制转换相关推荐
- 联盟手游服务器维护中怎么办,移动联盟手游进不去很卡怎么办?移动联盟进不去很卡问题详解[图]...
类型:角色扮演 大小:1125.85MB 评分:9.9 平台: 移动联盟手游进不去很卡怎么办?下面是友情MT为大家带来的移动联盟手游进不去很卡问题详解,希望能帮助到大家! 移动联盟手游进不去很卡怎么办 ...
- W ndows7怎么进入BlOS,Windows7旗舰版进不了bios界面的详解教程
最近,一些Win7用户安装了Win7旗舰版之后,发现进入不了bios界面,这个问题该怎么解决呢?有什么方法可以解决这个故障呢?下面,U大侠小编就给大家介绍下Windows7旗舰版进不了bios界面的详 ...
- Clickhouse的数据存储原理、二进制文件内容分析与索引详解
Clickhouse的数据存储原理.二进制文件内容分析与索引详解 Clickhouse以其强大的性能著称,已经被越来越多的使用在OLAP分析查询等场景中.Clickhouse是一个列式存储的数据库,而 ...
- STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解
STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解 上一次我们讲了OneNet平台的注册,这次我们来讲一下MQTT的常用报文用法 上一篇地址https ...
- 全民大数据时代已来 阿里数加平台详解
文章讲的是全民大数据时代已来 阿里数加平台详解,业界流行一种说法,云计算与大数据就是一枚硬币的两面,相生相惜,不可分割.在当下互联网时代,数据的价值越来越受到社会的认可,并在今天,已然成为一种普惠资源 ...
- pandas数据索引之loc、iloc、ix详解及实例
pandas数据索引之loc.iloc.ix详解及实例 先来个总结: loc函数:通过行索引 "Index" 中的具体值来取行数据(如取"Index"为&quo ...
- ant如何形成时间轴和图库_Python数据可视化常用4大绘图库原理详解_python
这篇文章主要介绍了Python数据可视化常用4大绘图库原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天我们就用一篇文章,带大家梳理mat ...
- 王牌竞速安装后显示服务器维护,王牌竞速服务器进不了 服务器登录问题详解...
不少玩家在游玩游戏的时候,出现王牌竞速服务器进不了的情况,那么我们此时该如何解决呢?下面我们就一起来看一下王牌竞速服务器问题详解吧. 维护更新 王牌竞速如果在维护和更新期间,我们是无法登录服务器进行游 ...
- javacv开发详解补充篇:解决转流后视频画面快进慢放,时间跳动过大,监控视频时间戳重新计算pts和dts
javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 本篇文章主要用于javacv重新计算pts和dts时间戳. 解决由于没有pts和dts时间戳或者pts和dts时 ...
- 去除html标签 express,详解Express条记之静态衬着HTML(新脚进坑)
在日常项目中,我喜欢用Django做后端, 因为大而全 如果只是写一个简单服务的话, Express是更好的选择, Express是基于nodejs的一个后端框架,特点是简单,轻量, 容易搭建, 而且 ...
最新文章
- Y15BeTa蜂鸣器唱歌程序-演奏版
- [数据库基础]——索引详解
- spring security源码分析之core包
- Log4j 日志详细用法
- ptcms精美小说阅读网站源码(带采集规则)
- python获取a股报表数据_python获取A股基础数据
- linux搭建git服务
- 一款漂亮的Bootstrap模板INSPINIA_adminV2.5 ---- 20161102
- 详解Python函数如何重载?
- exFAT硬盘写保护修复远程登录提示到期
- 离谱!程序员业余时间开发的项目,版权也属于公司的?
- Kubernetes(14):cordon暂停调度/uncordon恢复调度/drain驱逐
- Android加固与脱壳分析
- pipe()函数详解
- 代码实现矩阵求逆的三种方式(超详细、已实现)
- 高效实现统计分析(按日,月,周)查询功能
- office word安装mathtype报错,找不到mathpage.WLL文件
- 解决系统提示:内存不能为“read”或written的办法
- 朱棣文2009年哈佛大学演讲:未来并非在劫难逃
- 财务软件哪个好?便宜好用的财务软件有哪些?