快速幂

  # 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

原文地址:https://www.cnblogs.com/darkchii/p/7376167.html