快速计算x的n次幂 power()的实现

C++中的power函数 在cmath头文件中存在函数pow,在stl_numeric.h中存在对于power的具体实现 只看一下对于power的具体实现,之前不知道有没有听说过快速幂,power可以说就是快速幂的实现 函数原型如下: template <class T, class Integer> inline T power(T x, Integer n) { return power(x,... 阅读详情

原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7174143

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

[cpp]  view plain  copy
  1. //计算x^n 直接乘n次 by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )  
  2. int power1(int x, unsigned int n)  
  3. {  
  4.     int result = 1;  
  5.     while (n--)  
  6.         result *= x;  
  7.     return result;  
  8. }  

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

[cpp]  view plain  copy
  1. //计算x^n 二分递归实现  by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )  
  2. int power2(int x, unsigned int n)  
  3. {  
  4.     if (n == 0)  
  5.         return 1;  
  6.     else if (n == 1)  
  7.         return x;  
  8.     else   
  9.     {  
  10.         if (n % 2 == 1)  
  11.             return power2(x, n / 2) * power2(x, n / 2) * x;  
  12.         else  
  13.             return power2(x, n / 2) * power2(x, n / 2);  
  14.     }  
  15. }  

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

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

考虑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)。

函数实现如下:

[cpp]  view plain  copy
  1. //计算x^n   by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )  
  2. int power3(int x, unsigned int n)  
  3. {  
  4.     if (n == 0)  
  5.         return 1;  
  6.     int result = 1;  
  7.     while (n != 0)  
  8.     {  
  9.         if ((n & 1) != 0)  
  10.             result *= x;  
  11.         x *= x;  
  12.         n >>= 1;  
  13.     }  
  14.     return result;  
  15. }  

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

[cpp]  view plain  copy
  1. //计算x^n  by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )  
  2. int power4(int x, unsigned int n)  
  3. {  
  4.     if (n == 0)  
  5.     {  
  6.         return 1;  
  7.     }  
  8.     else  
  9.     {  
  10.         while ((n & 1) == 0)  
  11.         {  
  12.             n >>= 1;  
  13.             x *= x;  
  14.         }  
  15.     }  
  16.     int result = x;  
  17.     n >>= 1;  
  18.     while (n != 0)  
  19.     {     
  20.         x *= x;  
  21.         if ((n & 1) != 0)  
  22.             result *= x;  
  23.         n >>= 1;  
  24.     }  
  25.     return result;  
  26. }  

验证一下

[cpp]  view plain  copy
  1. int main()  
  2. {  
  3.     printf("验证power4()  -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");  
  4.     for (int i = 0; i <= 10; i++)  
  5.         printf("2的%d次方为\t%d\n", i, power4(2, i));  
  6.     return 0;  
  7. }  

结果为

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

 


SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全 SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全。版本:SolidWorks2021。电脑:惠普战66四代。软件安装不困难! 阅读详情

相关推荐

西门子WinCC VBS脚本实战:5分钟搞定变量记录导出到Excel(附完整代码)

本文提供了一套高效的西门子WinCC VBS脚本方案,帮助工程师在5分钟内将变量记录数据导出至Excel。方案详细解析了时区转换、数据库连接、SQL查询优化等核心难点,并附带了完整、可直接使用的VBS代码,解决了工业自动化项目中数据导出的实际痛点。

moss5的博客 609

STL 中的 power 函数实现

计算x的n次幂最简单直接的方法就是相乘n次,很容易写出程序: //计算x^n 直接乘n次 int power1(int x, unsigned int n) { int result = 1; while(n--) { result *= x; } return result; }   这种计算的效率显然不高,我们可以用二分法来加速计算x^n=x^(n/

MY_RENZHIBO的专栏 1570

自定义控件三部曲视图篇(六)——RecyclerView系列之三自定义LayoutManager

前言:把握生命里的每一分钟,全力以赴我们心中的梦,不经历风雨 怎么见彩虹,没有人能随随便便成功 在第一篇中已经讲过,LayoutManager主要用于布局其中的Item,在LayoutManager中能够对每个Item的大小,位置进行更改,将它放在我们想要的位置,在很多优秀的效果中,都是通过自定义LayoutManager来实现的,比如: 可以看到这些效果都非常棒,通过这一节的学习,大...

启舰 1万+

C++语言STL库常用函数

1、memset()批量初始化函数 1.原型:void *memset(集合,初始内容,大小)。 2.初始化可以为两种内容:整型0和-1,字符ASCLL 3.应用场景: 初始化数组0和-1(只能这两个值): #include<bits/stdc++.h> using namespace std; int main() { int a[10]; int b[10]; int c[10]; mem...

weixin_51474578的博客 2770

一文说清STM32CubeMX中文汉化全流程(图解说明)

详细讲解STM32CubeMX中文汉化的完整流程,通过图文并茂的方式手把手教学,解决界面英文带来的使用障碍,让开发更高效。掌握stm32cubemx中文汉化技巧,提升嵌入式开发体验。

weixin_42499004的博客 6270

TI电机驱动应用中MOSFET选型完整指南

深入解析TI电机驱动设计中MOSFET的选型关键,涵盖参数匹配、热性能与开关效率,帮助工程师优化系统性能并提升能效,是掌握MOSFET应用的核心参考。

weixin_42263617的博客 1270

python 中的函数

定义函数举例说明,这里求解x 的n次方的值。1. 通过定义power()这个函数,计算n个x相乘的得数,这个方法引入了一个临时变量s,来指导乘法的轮数:def power(x, n): s = 1 while n &gt; 0: n = n - 1 s = s * x return s2. 通过引入python中math模块的pow方法 + ...

xiaohuansun的博客 354

阿里云习题多选部分459道

比如: UserA的用户在杭州有一台经典网络的ECS云服务器InstanceA (内网IP: A.A.A),InstanceA所属的默认安全组为GroupA, UserB的用户在杭州有一台经 典网络的ECS云服务器InstanceB(内网IP:B.B.B),InstanceB所属的默认安全组为GroupB。43.创建阿里云的云服务器ECS实例之前,需要对ECS实例的配置进行选型,阿里云为用户提供了推荐的配置组合方案来满足大部分用户的需求,这些推荐配置只是作为开始使用云服务器ECS实例的参考。

2501_91384465的博客 1309

【例子1】求x的n次方,四种算法优化

wufaqidong1的博客 1072

UE5实战:如何用Georeference插件搞定百度地图坐标转换(附完整代码)

本文详细解析了在UE5中使用Georeference插件实现百度地图坐标转换的全流程,包括BD-09到UE内部坐标的转换算法、UTM投影配置及性能优化技巧。通过完整代码示例和实战案例,帮助开发者高效解决数字孪生项目中的地理坐标转换难题。

weixin_30955617的博客 94

从零到一:构建嵌入式Nginx的模块化架构与跨平台部署实战

本文详细介绍了在ARM32架构的RV1126嵌入式设备上,通过交叉编译技术构建模块化Nginx服务器的完整实战流程。涵盖环境配置、依赖库编译、Nginx核心与http_ssl_module等模块集成、性能优化及部署调试,为嵌入式开发提供高效可靠的Web服务器解决方案。

rock5的博客 202

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

计算x的n次幂最简单直接的方法就是相乘n次,很容易写出程序: [cpp] view plaincopy //计算x^n 直接乘n次 by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )  int power1(int x, unsigned int n)  {      int result = 1;      while (

rundll64的专栏 601

10、高阶ΣΔ调制器设计与优化

本文深入探讨了高阶ΣΔ调制器的设计与优化技术,重点介绍了NTF零点优化方法,通过分散单位圆上的零点分布提升信噪失真比(SQNR)。文章分析了量化噪声耦合技术如何有效提高噪声整形阶数,并对比了CIFB、CIFF、CRFB和CRFF等不同架构的性能特点。同时,详细阐述了基于稳定性与性能权衡的设计流程,结合Schreier的Delta-Sigma Toolbox实现NTF综合与仿真验证。内容涵盖从理论推导到实际设计步骤,为高阶ΣΔ调制器的稳定性提升与性能优化提供了系统性指导。

tgb345678的博客 134

快速计算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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

ffygvf的博客 220

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

实现 pow(x, n) ,即计算 x 的 n 次幂函数。

实现 pow(x, n) ,即计算 x 的 n 次幂函数。 public class Solution { double quickMul(double x, long N) { double ans = 1.0; // 贡献的初始值为 x double x_contribute = x; // 在对 N 进行二进制拆分的同时计算答案 while (N > 0) { if

weixin_47129394的博客 883

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

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

Pow(x,n)---快速幂算法

题目 实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例: 输入: 2.00000, 10 输出: 1024.00000 输入: 2.10000, 3 输出: 9.26100 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 说明: -100.0 < x < 100.0 n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。 解决方案 分别是递归和迭代两个版本,当指数 n 为负数时,

Astronaut224的博客 1934

C++——计算x的n次幂

C++实现计算x的n次幂 #include <iostream> using namespace std; class Calculator//创建计算类 { public: double calculator(double x, int n) { //如果n为0或1 if (n == 0) return 1; if (n == 1) return x; //如果n为负数,需要将n处理为正数 int i; i= -(n + 1); if (n < 0) re

qq_50992290的博客 7594

快速幂算法 Pow(x,n)函数的实现_20230515

本文通过快速幂学习,理解通过递归返回值的处理,最终得到需要的结果

Jasonchen1224的博客 651
上一篇: CodeForces - 893C Rumor (并查集)
下一篇: C++中关于string erase函数的使用
OneLine_
博客等级 码龄9年 48粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值