版权声明:写的不对的地方希望大家能“狠狠地”指出 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;
}