题目

将一个二进制数,转换为对应的十进制数。
输入
输入一个二进制数,以回车结束。该二进制数为正数,长度不超过31。
输出
输出一个整数,为该二进制数对应的十进制数。
样例输入 Copy
100000000001
样例输出 Copy
2049
然后附上神奇的提示:

(1) 整数运算尽量避免pow之类的double类型函数,以免截断取整带来错误。 (2)可使用递推思想,充分利用中间结果。类似思想可参考秦九韶算法。秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。计算一次多项式f(x) = a0xn + a1x(n-1) + … + an 只需要n次乘法和n次加法。原理是一次多项式f(x)可写成如下加括号方式:f(x) =(( (a0x + a1)x + a2) x + … an-1) x + an。自内向外去括号计算,只需要n次乘法和n次加法。
本题从高位到低位依次输出二进制数,对应多项式系数a0, a1,….,an, 而x的值为2。递推过程如下:
d = 0;
while( ch = getchar(), ch != ‘\n’)
d = d * 2 + (ch - ‘0’);


唔,题看完了,是不是有点懵逼(,如果你不了解秦九韶的多项式解法的话,下面的代码你可能会更懵

  1. #include<stdio.h>
  2. int main()
  3. {
  4. char ch;//定义字符ch
  5. int d=0;//初始化d为0
  6. while(ch=getchar(), ch!='\n')//当输入不等于换行符时,继续进行操作
  7. d=d*2+(ch-'0');//进行二进制计算每次结果*2,相当于往前递推一位
  8. printf("%d\n",d);//输出结果d
  9. return 0;//程序正常退出
  10. }
  11. //在这里我先解释一下“d=d*2+(ch-'0')”中,ch-'0'的意义,char的字符用ASSIC码存储
  12. //但是呢,拿数字举例:'1'的ASSIC码并不是1,所以要用ASSIC码来进行ASSIC字符的四则运算
  13. //需要讲字符转换,而恰好,数字的ASSIC码减去0的ASSIC码就等于数字本身了

别急,我们先从秦九韶开始,慢慢你就会知道为什么要这样写。

秦九韶多项式的解法

对于一个多项式:
1068: 二进制数(秦九韶算法解题) - 图1
改写成如下形式:
1068: 二进制数(秦九韶算法解题) - 图2
1068: 二进制数(秦九韶算法解题) - 图3
1068: 二进制数(秦九韶算法解题) - 图4
1068: 二进制数(秦九韶算法解题) - 图5
1068: 二进制数(秦九韶算法解题) - 图6
1068: 二进制数(秦九韶算法解题) - 图7

题目举例解析

那么这里用10101**(2) = 21(10)来举例子(字丑警告**)
image.png
image.png
emmm,合在一起的话:(我希望你看得懂这线条)
image.png

其他

暂时没有