#P03038. 二进制转十进制—进阶问题

二进制转十进制—进阶问题

题目背景

nn 进制数转十进制的方法是 加权求和法。以二进制数 (101101)2(101101)_2 (这里的下标 22 表明这是一个二进制数)为例,加权求和转十进制的过程如下:

$(101101)_2 = 1\times2^5+0\times2^4+1\times2^3+1\times2^2+0\times2^1+1\times2^0=(45)_{10}$

以八进制数 (7531)8(7531)_8 为例,加权求和转十进制的过程如下:

$(7531)_8 = 7\times8^3+5\times8^2+3\times8^1+1\times8^0=(3929)_{10}$

其实十进制数也能用加权求和表示,以十进制数 (975438)10(975438)_{10} 为例:

$(975438)_{10}=9\times10^5+7\times10^4+5\times10^3+4\times10^2+3\times10^1+8\times10^0$


此外,还可以用下面的方法来转换,还是以二进制数 (101101)2(101101)_2 为例:

$(101101)_2 = ((((1\times2+0)\times2+1)\times2+1)\times2+0)\times2+1=(45)_{10}$

仔细分析,以最高位的 11 为例,一共经历了 55×2\times2 的过程,其他位上数字同理,可知去掉括号整理后与加权求和算式一致。

对于二进制数,左移一位相当于 ×2\times 2,那么可以将上面的计算拆分成下面的过程:

  1. 开始时只有最高位(1)2(1)_2,左移一位并且把下一位 00 放在末位,那就变成了(10)2(10)_2,也就是 1×2+0=21\times2+0=2
  2. (10)2(10)_2 左移一位并且把下一位 11 放在末位,那就变成了(101)2(101)_2,也就是 2×2+1=52\times2+1=5
  3. (101)2(101)_2 左移一位并且把下一位 11 放在末位,那就变成了(1011)2(1011)_2,也就是 5×2+1=115\times2+1=11
  4. (1011)2(1011)_2 左移一位并且把下一位 00 放在末位,那就变成了(10110)2(10110)_2,也就是 11×2+0=2211\times2+0=22
  5. (10110)2(10110)_2 左移一位并且把下一位 11 放在末位,那就变成了(101101)2(101101)_2,也就是 22×2+1=4522\times2+1=45

🚀️ 编程时,可以考虑用下面等效的算式(相当于最高位左侧再添加一个 00):

$(0101101)_2 = (((((0\times2+1)\times2+0)\times2+1)\times2+1)\times2+0)\times2+1=(45)_{10}$

  1. 最高位(0)2(0)_2左移一位并且把下一位 11 放在末位,那就变成了(01)2(01)_2,就是(1)2(1)_2,也就是 0×2+1=10\times2+1=1
  2. (1)2(1)_2 左移一位并且把下一位 00 放在末位,那就变成了(10)2(10)_2,也就是 1×2+0=21\times2+0=2
  3. (10)2(10)_2 左移一位并且把下一位 11 放在末位,那就变成了(101)2(101)_2,也就是 2×2+1=52\times2+1=5
  4. (101)2(101)_2 左移一位并且把下一位 11 放在末位,那就变成了(1011)2(1011)_2,也就是 5×2+1=115\times2+1=11
  5. (1011)2(1011)_2 左移一位并且把下一位 00 放在末位,那就变成了(10110)2(10110)_2,也就是 11×2+0=2211\times2+0=22
  6. (10110)2(10110)_2 左移一位并且把下一位 11 放在末位,那就变成了(101101)2(101101)_2,也就是 22×2+1=4522\times2+1=45

题目描述

输入一个二进制正整数,计算输出其对应的十进制数。

输入格式

一个二进制正整数。

输出格式

一个正整数。

输入输出样例

101101
45

说明/提示

👀️ 对于100%100\%的数据,输入的二进制数位数不超过 6060,最高位是 11 ,其他位是 0011