清华复试上机 10进制 VS 2进制 题解
题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
1 | 一个1000位(即10^999)以内的十进制数。 |
输出描述:
1 | 输入的十进制数的二进制逆序数。 |
这是本人目前刷题到现在最讨厌的题型,大整数的各种操作。因为超过了long long 的表示范围,所以只能用字符串或者int数组来存储数据,然后逐位操作。
这里使用string类型来存储大整数滴~
需要实现的功能函数有:字符串的除法、加法和乘法。思路都非常简单一致,就是按照运算规则,从高位到低位(除法)、从低位到高位(加法、乘法)逐位来进行运算。
字符串的除法(因为是转换成二进制,所以是计算除以2的情况):
1 | string div(string s) { |
字符串的加法:
1 | string add(string s) { |
字符串的乘法(*2):
1 | string mul(string s) { |
整体的代码如下:
1 |
|