# 2018-07-29 update
用字符输入二进制数据:
#include <iostream> // 计算x的n次方的函数 long int expo(long int base, unsigned int n) { if (n == 0) return 1; else if (n & 1) return expo(base*base, n >> 1); else return expo(base, n - 1)*base; } int char2int(const char* str) { int sum = 0, len = strlen(str); for (unsigned int i = 0; i < len; i++) sum += (str[i] - '0') * expo(2, len - i - 1); return sum; } int main() { char bi[64]; std::cout << "请输入二进制数:"; std::cin >> bi; int sum = char2int(bi); std::cout << "(" << bi << ")B = (" << sum << ")D" << std::endl; return 0; }
顺便提一下long long 型的输出方式,代码:
printf("(%s)B = (%I64d)D ", binary, sum);
windows上使用%ld输出则会有警告,这样就不会了...%ld是在Linux上的输出方式。
顺带说说快速幂算法。上面求 $ x^n $ 代码就是递归版的快速幂算法,主要原理用例子来解释就明白了:
例如 $ 2^8 $,假如像下面这样写算法效率会很低:
a = 2, b = 8, c = 1; while (b--) c *= a;
我们可以这样优化,直觉上能看到对偶数个2相乘进行分组会更快:
$$ egin{aligned} 2^8 &= ((2*2)*(2*2))*((2*2)*(2*2)) \ &= (4*4)*(4*4) \ &= 16*16 end{aligned} $$
这就是递归算法的原理,当然还可以转化成迭代形式:
#define ll long long ll expo(ll a, ll b) { ll res = 1; while (b > 0) { if (b & 1) res = (res * a); a = (a * a); b >>= 1; } return res; }
更多的关于快速幂算法请移步:https://en.wikipedia.org/wiki/Exponentiation_by_squaring