分治策略求a^n

版权声明:写的不对的地方希望大家能“狠狠地”指出 https://blog.csdn.net/qq_37006625/article/details/84035398

1.问题描述
采用分治策略来求解a^n
2.问题分析
如果采用常规方法,n个a相乘,算法的复杂度是O(n)

如果采用分治策略,算法的复杂度则可大大减少

  • a.当n为偶数时:a^n =(a^n/2) * a^n/2;
  • b.当n为奇数时:a^n = a^(n-1)/2 * a^(n-1)/2*a;
  • c.当n=1时: a^n=a;

此时复杂度减少为O(logn)

3.代码

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

typedef long long ll;

ll fac(int a, int n)
{
	if (n == 1)
		return a;
	if (n & 1)
	{
		return pow(fac(a, (n - 1) / 2), 2) * a;
	}
	else {
		return pow(fac(a, n / 2), 2);
	}
}

ll no_fac(int a, int n)
{
	ll result = 1;
	ll tmp_a = a;
	while (n)
	{
		if (n & 1)
		{
			result = result * tmp_a;
		}
		tmp_a = pow(tmp_a, 2);
		n = n >> 1;//移位运算,相当于n/2
	}
	return result;
}

int main()
{
	int a, n;
	while (~scanf("%d%d", &a, &n))
	{
		cout << "递归:" << fac(a, n) << endl;
		cout << "非递归:" << no_fac(a, n) << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37006625/article/details/84035398
今日推荐