文章

1

粉丝

0

获赞

0

访问

101

头像
进制转换 题解:
P1178 北京大学上机题
发布于2026年5月13日 20:12
阅读数 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,死活都报错crying

work()函数则是作为每次处理一个大数进制转换用的。

首先你得定义一个vector<int>的一个容器来存储你转化为的结果。

一个循环,循环遍历大数的每一位,先将取模的数填入num,然后将打出除以2,接着你得将vector容器调转,关于这一点你如果不清楚为什么建议你去查一下资料(搜10进制转2进制过程)。调转完后就得打印出来。

之后的mod函数,就是将最后一位取到,然后判断将它对2取模返回。

div函数是个重点

首先你得先定义一个存储除完2后的结果,string res,然后定义借位t,开始循环遍...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发