文章
1
粉丝
0
获赞
0
访问
101
关于这个大数10进制转2进制问题。
我已经试过,如果你不考虑大数,把他当作long long 来处理,可以过50%用例,这个可以用来骗分。(当然我再平时练习的时候不建议这么做)
思路:
首先我们得清楚10进制转2进制的本质 %2和 /2到底是什么含义。
%2我们得将这个行为理解为判断整个大数的奇偶性,那么一个数的奇偶性取决于最低位的数,若最低位是奇数,那么整个数就为奇数,同理,最低位为偶数,那么整个数就为偶数。
那么%2的操作我们就解决了,我们只需要找到大数的最后一位,然后判断即可。
/2这个数,我们就得讲究一点了,首先我个人是将这个大数看成三部分,第一部分是最高位,最高位无法借位,但是可以给低位借位;第二部分最低位,最低位可以借位,但是无法给下一位借位,因为它已经是最低位了,它的后面没有位了;第三部分就是其余位,可以借位,也可以给低位借位。我们得想想我们手算十进制除以2时,是不是先看看这一位能不能整除2,若不能则给商的对应那位填0,然后借位到下一位继续算,如果够除2,那么我们就把这一位的值x,x/2的值放到商上,然后将x%2*10给到下一位。直到被除数的最后一位结束。


以上是我的代码,我下面就会细细讲解一下我的代码意图。(代码甚至一开始是参考一个大佬的)
首先main()函数的话很简单,就是要循环读入大数,因为题目要求得连续读。但是作者在一开始竟然不知道可以用while(cin>>s)来表示条件,作者一开始写的是while(scanf("%s",&s)),然后因为定义的是string s,死活都报错
。
work()函数则是作为每次处理一个大数进制转换用的。
首先你得定义一个vector<int>的一个容器来存储你转化为的结果。
一个循环,循环遍历大数的每一位,先将取模的数填入num,然后将打出除以2,接着你得将vector容器调转,关于这一点你如果不清楚为什么建议你去查一下资料(搜10进制转2进制过程)。调转完后就得打印出来。
之后的mod函数,就是将最后一位取到,然后判断将它对2取模返回。
div函数是个重点
首先你得先定义一个存储除完2后的结果,string res,然后定义借位t,开始循环遍...
登录后发布评论
暂无评论,来抢沙发