STL系列之七 快速计算x的n次幂 power()的实现

C++ STL在算法竞赛中的高效应用与优化技巧 标准模板库(STL)是C++编程中处理数据结构和算法的核心工具集,其设计基于泛型编程思想,通过模板实现高度可复用的容器、迭代器和算法组件。在算法竞赛场景下,STL的vector动态数组、map有序映射等容器配合sort排序、lower_bound二分查找等算法,能够将常见问题的解决效率提升至理论最优复杂度。性能优化关键在于理解各容器内存分配策略(如vector的2倍扩容)和算法底层实现(如sort的内省排序),结合输入输出加速、内存预分配等工程技巧,可应对ACM/ICPC等竞赛中的极端时间限制。典型应用包括 阅读详情

计算x的n次幂最简单直接的方法就是相乘n次,很容易写出程序:

//计算x^n 直接乘n次 by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )
int power1(int x, unsigned int n)
{
	int result = 1;
	while (n--)
		result *= x;
	return result;
}

这种计算的效率显然不高,我们可以用二分法来加速计算x^n=x^(n/2)* x^(n/2)即x^10=x^5*x^5,这种计算N次幂只要相乘O(logN)次。运用递归的方法不难写出:

//计算x^n 二分递归实现  by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )
int power2(int x, unsigned int n)
{
	if (n == 0)
		return 1;
	else if (n == 1)
		return x;
	else 
	{
		if (n % 2 == 1)
			return power2(x, n / 2) * power2(x, n / 2) * x;
		else
			return power2(x, n / 2) * power2(x, n / 2);
	}
}

递归毕竟比较浪费时间,且会有很多重复计算。

因此最好能换成非递归的方式来实现二分法。

考虑x^23,可以先从x ->x^2 -> x^4 -> x^8 -> x^16 取result1 = x^16,然后23-16=7。

我们只要计算x^7再与result1相乘就可以得到x^23。对于x^7也可以采用这种方法

取result2 = x^4,然后7-4=3,只要计算x^3再与result2相乘就可以得到x^7。由此可以将x^23写成x^16 * x^4* x^2 * x,即23=16+4+2+1,而23 = 10111(二进制),所以只要将n化为二进制并由低位到高位依次判断如果第i位为1,则result *=x^(2^i)。

函数实现如下:

//计算x^n   by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )
int power3(int x, unsigned int n)
{
	if (n == 0)
		return 1;
	int result = 1;
	while (n != 0)
	{
		if ((n & 1) != 0)
			result *= x;
		x *= x;
		n >>= 1;
	}
	return result;
}

此函数可以在相乘O(logN)次内计算x的n次幂,且避免了重复计算。但还可以作进一步的优化,如像48=110000(二进制)这种低位有很多0的数,可以先过滤掉低位的0再进行计算,这样也会提高一些效率。程序如下:

//计算x^n  by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )
int power4(int x, unsigned int n)
{
	if (n == 0)
	{
		return 1;
	}
	else
	{
		while ((n & 1) == 0)
		{
			n >>= 1;
			x *= x;
		}
	}
	int result = x;
	n >>= 1;
	while (n != 0)
	{	
		x *= x;
		if ((n & 1) != 0)
			result *= x;
		n >>= 1;
	}
	return result;
}

验证一下

int main()
{
	printf("验证power4()  -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");
	for (int i = 0; i <= 10; i++)
		printf("2的%d次方为\t%d\n", i, power4(2, i));
	return 0;
}

结果为

 
看到这里,理解STL的power()函数应该就是个水到渠成的事情了——我们自己写的power4()正是STL的power()函数。

 

 注,非常感谢网友evaxiao帮我找出了power4()的一个错误,我已经在文中改正了,谢谢网友evaxiao。

 

转载请标明出处,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7174143

 

Ubuntu24安装MongoDB(解压版) 依据前面 Linux 发行版本的信息,选择你需要的版本,文件格式选择 tgz 格式,最后点击 Download(下载到你的电脑)或 点击 Copy link 左侧图标(复制下载链接在使用服务器下载)依据前面 Linux 发行版本的信息,选择你需要的版本,文件格式选择 tgz 格式,最后点击 Download(下载到你的电脑)或 点击 Copy link 左侧图标(复制下载链接在使用服务器下载)默认情况下,只能在本机访问 MongoDB,要想远程访问 MongoDB,需要修改配置文件。 阅读详情

相关推荐

STM32F103ZE精英板驱动ESP8266与DHT11构建物联网网关,实现乐联网温湿度数据实时监控

本文详细介绍了如何使用STM32F103ZE精英板驱动ESP8266与DHT11构建物联网网关,实现乐联网温湿度数据实时监控。从硬件选型、连接调试到乐联网平台配置和STM32程序开发,提供了完整的实现步骤和常见问题解决方案,适合物联网入门开发者参考。

weixin_30823001的博客 78

算法练习--Pow(x,n)__二分法、递归

题目: 实现pow(x,n),即计算 x 的 n 次幂函数。 示例: 输入: 2.00000, 10 输出: 1024.00000 个人思路: 判断n是正数还是负数,如果是负数,则返回正数次幂的倒数。使用二分法,求一半的次幂,然后在平方(如果次幂为奇数,那么还需要再乘一次x) 代码: class Solution { public double myPow(double x, int n) { long N=n; return N>=0?...

QilanAllen的博客 433

RTL8306交换机芯片与FPGA联调实战:5个网口+1个MAC的配置避坑指南

本文详细解析了RTL8306交换机芯片与FPGA联调中的关键技术难点,特别是MAC5寄存器的配置陷阱和PHY页切换机制。通过实战案例和优化策略,帮助开发者高效配置5个网口+1个MAC的工业级网络设备,提升系统稳定性和实时性。

vodka的博客 1094

递归二分法算x的n次方

递归二分法算x的n次方 class Solution { public: double myPow(double x, long n) { if(x==-1){ if(n%2==0) return 1; else return -1; }else{ if(n==0||x==1) return 1; if(n==1) return x; if(n&l

X1579983102的博客 698

Win11家庭版如何让Win+R运行CMD默认管理员权限?3种方法实测有效

本文针对Win11家庭版用户,实测了三种让Win+R运行CMD默认获取管理员权限的有效方法。通过分析UAC机制与家庭版功能限制,详细介绍了注册表编辑、快捷方式创建与任务计划程序三种方案的原理、步骤与风险对比,帮助用户根据安全与效率需求选择最佳方案,实现一键高效管理。

sat99的博客 1267

智能体评测技术与实践:从评估维度到DeepEval实战指南

智能体评测技术与实践:从评估维度到DeepEval实战指南 本文系统探讨了AI智能体的评测体系与实践方法。首先从四个关键维度构建评估框架:基础能力(意图理解、知识完整性)、复杂任务(多轮对话、动态工作流)、可靠性(幻觉抑制、安全合规)以及工具效率(参数填充、多工具协同)。其次分析了主流评测工具,包括xBench的动态双轨评估、DeepEval的全链路监控等解决方案。最后详细介绍了DeepEval的实战应用,涵盖环境配置、测试用例构建、指标配置及CI/CD集成,展示了如何通过代码化评估实现智能体质量的持续提升

Linda的自动化测试之旅 3414

二分法快速计算x的n次幂(递归和循环实现)

题目:http://learn.akae.cn/media/ch11s06.html 编写一个函数double mypow(double x, int n);求x的n次方,参数n是正整数。最简单的算法是: double product = 1; for (i = 0; i < n; i++) product *= x; 这个算法的时间复杂度是Θ(n)。其实有更好的办法,比如mypo

wsccdsn的专栏 4445

AWS入门实践-如何在AWS云上创建一个内外网隔离的生产环境

在 AWS 上建立一个内外网分离的生产环境,可以减少应用服务的暴露面,有效的保证你的应用服务器的安全。通常我们会将web应用放在外网的子网内,数据库服务器等放在内网的子网。我们将按照下图来部署动手实践环境,实现在public subnet的EC2虚拟机可以直接通过互联网可以访问,在Private subnet的EC2虚拟机不能通过互联网直接访问,但是却可以在内部来访问互联网安装应用等等。

weixin_39108752的博客 2994

两种方法求x的n次幂

一、递归方法分析: 在求一个数x的n次幂时,可分为偶数和奇数两种情况来讨论,若x为偶数,则x^n=x^n/2 * x^n/2,若果x为奇数,则x^n=x^(n-1)/2 * x^(n-1)/2 * x。它的基准情况(无需递归即能解出)很明显,就是n==0和n==1时,n==0时,则任何数的0次幂均为1,n==1时,任何数的1次幂均为它本身。有了上述分析后,代码就很容易写出了。public clas

晓风残月龙 2万+

银行监管报送系统系列介绍(二十一):银行监管报送系统总览

为保护法院案件当事人、利害关系人的合法权益,全面落实《最高人民法院、中国银行业监督管理委员会关于人民法院与银行业金融机构开展网络执行查控和联合信用惩戒工作的意见》(法【2014】266号),最高人民法院和银监会联合下发了《人民法院、银行业金融机构网络执行查控工作规范》(法【2015】321号),要求银行金融机构配合最高人民法院开展 “总对总”网络执行查控工作,并建立相应的业务系统,实现与法院的网络对接,协助法院完成对被执行人银行账户存款及其他金融资金的网络查询、冻结与扣划工作。

银行信息系统应用架构详解 2863

泰凌微8258入门教程 环境篇④——开发板+烧录器 8258mesh新手套件购买

工欲善其事,必先利其器。 淘宝链接:https://item.taobao.com/item.htm?

4128

linux C下利用递归函数求x的n次方

用函数递归的方法计算s=pow(x,n) 注意:用pow求次方时要加&lt;math.h&gt;头文件 代码如下: 结果如图: 注意:看上去结果并没有什么问题,但是在fun函数中并没有调用自身,也就是说并没用进行递归运算,只是单纯的进行了x与x的n-1次方相乘,所以上面代码并不正确。 下面只需要修改一个地方便能实现函数递归。 代码如下: 只是把递归函数内返回值x*pow(...

a1014895406的博客 7289

【专栏必读】王道考研408计算机组成原理万字笔记使用说明及章节导航

本文是为准备408王道计算机组成原理考试的学生精心整理的万字笔记,涵盖了从计算机系统概述、数据表示和运算到存储系统、指令系统等多个章节的重点内容。本文强调了学习笔记的重要性,并分享了学习建议,如按视频课逻辑记录,建立学科框架。笔记详细记录了每章的关键知识点,包括存储器、CPU、I/O系统的工作原理,还附带了习题和思维导图,旨在帮助考生高效复习。

快乐江湖的博客 9万+

STL系列之七 快速计算x的n次幂 power 的实现

STL系列之七 快速计算x的n次幂 power 的实现

ffygvf的博客 220

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

快速计算x的n次幂 -- 二分思想

原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7174143 计算x的n次幂最简单直接的方法就是相乘n次,很容易写出程序: [cpp] view plain copy //计算x^n 直接乘n次 by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) int po...

moots 2564

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SGI STL power函数 思想总结笔记

在看侯捷STL源码剖析时,看到power函数时,有点犯晕。感觉和在其他算法书上看到的不太一样,怎么也理解不了,依稀记得编程之美上有相关问题的讨论。 然后google了下,找到下面这篇文章:http://blog.youkuaiyun.com/ariesjzj/article/details/6413258 才突然对SGI power的思想有些理解。故做笔记记录一下。 首先,复习一下计算机导论...

weixin_30877181的博客 129

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STL源码剖析之算法:power

在power算法中求一个数x的n次方分成两部分,一是当n为偶数时计算方法,另一部分是当n为奇数时的计算方法。在n的"分解"过程中,还可能还会出现偶数和奇数部分的代码都参与计算。 n为偶数,计算方式: 假设 Y = x*x , Z = n / 2; 那么xn = YZ。例如如下步骤: 28 = 44。 (1) 44 = 162...

weixin_34038293的博客 227

SGISTL源码探究-stl_numeric.h中的数值算法

前言上一小节中,我们对stl中的算法部分做了一个大致的说明。本小节我们将进入到其中关于数值算法的部分,都在stl_numeric.h文件中。废话不多说,直接看源码吧。stl_numericaccumulate注意该算法要求了迭代器的类型至少是InputIterator类型,如果是OutputIterator类型,肯定是不行的。 用于计算元素总和,init加上[first, last)范围内的元素之

Move_now的博客 682

REA 逆向工作流:无源码快速读懂二进制、APK 与网页,结论带证据

REA(reverse-engineer-anything)把逆向工作流接入 AI 编码助手,让没有源码时也能查清一个应用到底怎么运行。它最核心的一条能力,是顺着调用和交叉引用一直追到底,每条结论都附带可复核的证据与限制说明。 [![REA 在 Hopper 中分析原生二进制并恢复反汇编与引用的逆向工作流截图](https://raw.gitcode.com/GitHub_Trending/re

gitblog_00740的博客 427

C++模板编程:从泛型基础到STL实战应用

泛型编程是一种编程范式,它通过参数化类型来实现代码的复用和类型安全。其核心原理是编写与具体数据类型无关的通用代码,编译器在编译时根据实际使用的类型生成特化版本。这种技术极大地提升了代码的复用性和灵活性,是构建通用库和框架的基石。在C++中,泛型编程主要通过模板技术实现,其价值在于能够创建类型安全的容器和算法,避免代码重复。应用场景广泛,从标准模板库(STL)中的vector、map等容器,到sort、find等泛型算法,再到日常开发中的工具类封装,都离不开模板。本文将深入解析函数模板和类模板的实现机制,并通

weixin_33937778的博客 563
上一篇: PHP访问MySql数据库 高级篇 AJAX技术
下一篇: STL系列之八 slist单链表
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 31
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值