分治法实现一个数的n次方

算法导论上说分治法解决一个数的n次方,它的复杂度为logn;而用连乘的复度n;

#include<iostream>
using namespace std;
int recursion(int x,int n){
	if(n==1){
		return x;
	}else {
		if(n%2==0){//n为偶数
			int r=recursion(x,n/2);
			return r*r;
		}else{//n为奇数
			int r=recursion(x,(n-1)/2);
			return r*r*x;
		}
	}
}
int main(){
	int x=2;
	int n=17;
	cout<<recursion(x,n)<<endl;
}

  

时间: 2024-10-24 04:38:14

分治法实现一个数的n次方的相关文章

利用分治法求n个数的最大连续和

解决这个问题,采用前缀和平扫的时间复杂度为O(n^2),本文分治法的时间复杂度为O(n*log*(n)) 前缀和平扫首先对n个数做前缀和,接下来利用前缀和枚举每一个区间即可 分治法的代码实现如下: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=20000005; 5 const int INF=0x7fffffff; 6 long long a[maxn]; 7

使用分治法得到一个数中位元为1的个数

有这么一个问题, 给定一个数(假定32位), 如何得到这个数转为二进制后1的个数? 解: X=(x & 0x55555555)+((x>>1)&0x55555555) X=(x & 0x33333333)+((x>>2)&0x33333333) X=(x & 0x0F0F0F0F)+((x>>4)& 0x0F0F0F0F) X=(x & 0x0000FFFF)+((x>>1)& 0x0000FF

分治法 求 逆序对数 的个数 时间复杂度为O(n*logn)

思路: 分治法 归并排序的过程中,有一步是从左右两个数组中,每次都取出小的那个元素放到tmp[]数组中 右边的数组其实就是原数组中位于右侧的元素.当不取左侧的元素而取右侧的元素时,说明左侧剩下的元素均比右侧的第一个元素大,即均能构成一个逆序对.假设现在左侧剩余n个元素,则逆序对数+n. 另外,如果当所有右侧的元素都取完,但是左侧仍然有元素剩余时,左侧剩余的元素已经在之前的运算中加到了逆序对中,不需要再添加一次 下面给出 归并排序 和 求逆序对数 两份代码: code1: 归并排序 #includ

Quick-Select 1亿个数快速求第K小的数 分治法

Quick-Select  1亿个数快速求第K小的数  分治法 利用快速排序的思想,一开始选取中枢元,然后左右调整,接着比对中枢元p和K的大小,如果 p+1 = k (数组从0开始), 那么a[p] 就是答案,因为在p之前的,肯定都是小于a[p]的, 在p之后的,肯定大于p, 所以 a[p] 就是第 p+1 小.假如 p+1 不等于K, 那么根据大小,进行左右调整.调整过程中,理想状态下,每次都砍掉一半,数组的起始坐标要进行调整. 代码: // 快速排序法的修改 #include <iostre

蓝桥杯——分治法之子集合的个数

{1,2,3}子集合的个数,有{1},{2},{3},{1,2},{2,3},{1,3},{1,2,3},求n个元素组成的集合,m个元素组成的子集合的个数. 如上例,3个元素由其中2个组成的子集合有3个. public class Main{ public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(cal(3, 2)); } static int cal(int n,

【leetcode 分治法】Pow(x, n)与Sqrt(x)函数的实现

</pre>Pow(x, n)</h1><h1><span style="color:#3333ff;">1.分析</span></h1><div><span style="font-size:18px;">函数原型double pow(double x, int n),实现求x的n次方.</span></div><div><sp

数据结构与算法6 - 分治法(上)

分治法: 1. 将问题拆分为几个子问题,并且这些子问题和原问题相似只是量级上小一些. 2. 递归地解决每一个子问题,然后结合这些子问题的解决方案构造出原问题的解决方案. 我们已经遇到过的问题: 1. 二分搜索 2. 归并排序 3. 快速排序 分治法例子: 练习1:快速指数: 能够快速计算出a的n次方 def Fast_pow(a, n): if n == 0: return 1.0 elif n < 0: return 1 / Fast_pow(a, -n) elif n % 2: # 奇数 r

专题:分治法

分治法(Divide and Conquer) 作为五大算法之一的分治法,可算是最早接触的一种算法.分治法,与其说是一种算法,不如将其称为策略来的更贴切一些.算法的思想就是将大问题分成小问题,并解决小问题之后合并起来生成大问题的解. 分治法的精髓: 分--将问题分解为规模更小的子问题: 治--将这些规模更小的子问题逐个击破: 合--将已解决的子问题合并,最终得出“母”问题的解: 分治法的作用,自然是让程序更加快速地处理问题.比如一个n的问题分解成两个n/2的问题,并由两个人来完成,效率就会快一些

分治法(一)

这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它们放在一起来比较,看看分治是如何实现滴.由于内容太多,我将再花一篇文章来写4个之前没有写过的分治算法:1,大整数乘法   2,矩阵乘法的分治策略   3,最近点对  4,凸包问题,请见下一篇. 好了,切入正题. --------------------------------------------