一个数的n次幂求法(常规、快速)

❤ 作者主页:李奕赫揍小邰的博客
❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~*
🍊 记得点赞、收藏、评论⭐️⭐️⭐️
📣 认真学习!!!🎉🎉


 

常规求幂

  常规方法就是n次方,循环n次,自身乘自身

int pow1(int a,int b){
	int r=1;
	while(b--){
		r=r*a;
	}
	return r;
}

 

快速求幂

  比如4次幂,可以变成2次幂的2次幂,只计算2次即可,所以简单很多

int pow2(int a,int b){
	int r=1,base=a;
	while(b!=0){
		if(b%2)	r*=base;
		base*=base;
		b/=2;
	}
	return r;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 好的,下面是利用分治法求一组据中最大的两个和最小的两个的步骤: 1. 将原组分成两个规模相等的子组。 2. 对这两个子组分别求出最大值和最小值以及大值和小值。具体的求解法可以用常规的比较大小法。 3. 将两个子组的最大值和大值进行比较,得到整个组的最大值和大值。 4. 将两个子组的最小值和小值进行比较,得到整个组的最小值和小值。 经过这样的分治处理,我们可以得到一组据中最大的两个和最小的两个。 ### 回答2: 分治法是一种将问题分解成更小、更简单的子问题,并将子问题的解合并得到原问题解的法。利用分治法求一组据中最大的两个和最小的两个可以按照以下步骤进行: 1. 将原据分成两部分,分别为左半部分和右半部分。 2. 对左半部分和右半部分分别进行递归调用,得到左半部分的最大两个和最小两个,以及右半部分的最大两个和最小两个。 3. 将左半部分和右半部分的最大两个和最小两个合并得到整体的最大两个和最小两个。 4. 返回整体的最大两个和最小两个。 具体的实现可以按照以下伪代码进行: ``` def findMaxAndMin(nums): # 如果组中只有一个元素,直接返回这个元素作为最大和最小值 if len(nums) == 1: return (nums[0], nums[0]) # 将组分成两半 mid = len(nums) // 2 left_nums = nums[:mid] right_nums = nums[mid:] # 递归调用分治法 left_max, left_min = findMaxAndMin(left_nums) right_max, right_min = findMaxAndMin(right_nums) # 合并左半部分和右半部分的最大最小值 max_val = max(left_max, right_max) min_val = min(left_min, right_min) return (max_val, min_val) ``` 通过调用 `findMaxAndMin` 函,可以得到给定据中的最大两个和最小两个。 需要注意的是,由于要将据分成两半,每个部分都需要进行递归调用,因此时间复杂度为 O(nlogn)。 ### 回答3: 分治法是一种将问题分解为更小的子问题并通过解决子问题来解决原始问题的算法思想。当我们利用分治法来求一组据中最大的两个和最小的两个时,可以按照以下步骤进行: 1. 将原始据分成两个等分的子组。 2. 分别对这两个子组进行递归,找到每个子组的最大和最小。 3. 将每个子组的最大和最小进行比较,找出全局的最大和最小。 4. 返回全局最大和最小。 具体实现步骤如下: 1. 选取组中间元素,将组分成两个子组。 2. 对左边子组以及右边子组进行递归,找到左边子组的最大和最小,以及右边子组的最大和最小。 3. 将左边子组的最大和最小与右边子组的最大和最小进行比较,找出全局的最大和最小。 4. 返回全局最大和最小。 伪代码如下: function findMaxAndMin(arr, start, end): if start == end: return (arr[start], arr[start]) else if start + 1 == end: return (max(arr[start], arr[end]), min(arr[start], arr[end])) else: mid = (start + end) / 2 left_max, left_min = findMaxAndMin(arr, start, mid) right_max, right_min = findMaxAndMin(arr, mid+1, end) return (max(left_max, right_max), min(left_min, right_min)) 最后,调用函 findMaxAndMin() 传入待求解的组,起始索引为0,结束索引为组长度减1,即可得到最大的两个和最小的两个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李奕赫揍小邰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值