快速幂——二分法/分治法的典型应用

问题

  • 2 n 2^n 2n的值(n足够大)

解法:快速幂

  • 当n为偶数时, 2 n = 2 n / 2 ∗ 2 n / 2 2^n=2^{n/2}*2^{n/2} 2n=2n/22n/2
  • 当n为奇数时, 2 n = 2 [ n / 2 ] ∗ 2 [ n / 2 ] ∗ 2 2^n=2^{[n/2]}*2^{[n/2]}*2 2n=2[n/2]2[n/2]2

Q:为什么选 n / 2 n/2 n/2,而不是其他组合
A:当希望是二元组合时, n / 2 n/2 n/2最好,因为两个值相同,算一个即可;当希望是m元组合时,可以选n/m。

因此可以用递归解决该问题

  • 若题目要求对大素数求余,可以在算出 2 n / 2 2^{n/2} 2n/2return时求余
int func(int x) // 2^n
{
     
	if (x==0) return 1;
	int a = func(x/2);
	if (x % 2 == 0) return a * a;
	return a * a * 2;
}

你可能感兴趣的:(数据结构与算法设计,算法,leetcode)