Pow(x, n) 求一个数的n次方
我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目。
所需数学知识:
大致考虑正数,0,负数即可。n多个数相乘的问题。
1.简单For循环
这还不简单,马上写一个for循环:
double pow(double x, int n){int m = abs(n);double result = 1;for(int i = 0; i < m; ++i){result *= x;}return n > 0 ? result : 1/result;
}
2.最慢的递归求解
受 1+2+3+4+5...+N的问题用递归求解思路影响,我们知道这里可以用一个非常慢的递归来求解。
double pow(double x, int n){if(n == 0){return 1;}if(n > 0 ){return x * pow(x, n - 1);}else{return 1 / pow(x, -n);}}
搞不好比for循环还要慢。
3.很大改进的递归求解
都先考虑正数。我们在想,n多个2相乘,如果n刚好能被2整除,我们可以把n分成一半一半来考虑。
可以把它们想成是一半*一半,不能被2整除的话,也只是多乘以一个自己。
double pow(double x, int n){if(n == 0){return 1;}if(n > 0 ){double half = pow(x, n / 2);if(n % 2 == 0){return half * half;}else{return half * half * x;} }else{return 1 / pow(x, -n);}
}
我们知道这里的 n / 2,和 n % 2还可以用位运算来提高速度
n / 2 == n >> 1 (在返回是int值的情况下)
n % 2 == n&1
修改如下:
double pow(double x, int n){if(n == 0){return 1;}if(n > 0 ){double half = pow(x, n >> 1);if((n&1) == 0){return half * half;}else{return half * half * x;} }else{return 1 / pow(x, -n);}
}
4.当然还有优化空间!
3标题中我们其实做的事情是对n的每次取半再相加,这样太慢了,直接除以2比较快。当然遇到不能整除的要多乘以一个自己。
double pow(double x, int n){int m = abs(n);double result = 1;while(m > 0){if(m % 2 != 0){result = result * x;}x *= x;m = m / 2;}return n > 0 ? result : 1 / result;
}
通过位运算优化后就是:
double myPowFunction(double x, int n){int m = abs(n);double result = 1;while(m > 0){if((m&1) != 0){result = result * x;}x *= x;m >>= 1;}return n > 0 ? result : 1 / result;
}
看了下vs中的pow实现,也是类似的思想。
Pow(x, n) 求一个数的n次方
Pow(x, n) 求一个数的n次方相关推荐
- c语言一个数的n次方,Pow(x, n) 求一个数的n次方
我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目. 所需数学知识: 大致考虑正数,0,负数即可.n多个数相乘的问题. 1.简单For循环 这还不简单,马上写一个for循环:d ...
- 使用 Math.pow()方法,求出 2 的 32 次方的值
java基础题 使用 Math.pow()方法,求出 2 的 32 次方的值 ```java //1.使用 Math.pow()方法,求出 2 的 32 次方的值. //static double p ...
- (Java蓝桥杯算法)给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。
[问题描述] 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次: [输入格式] ...
- k次方 求1个数的n次方的前三位数和后三位数
K次方 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submissio ...
- Java中求一个数的幂次方
Java中求 m 的 n 次方不能使用 m^n,可使用 Math.pow(m, n) 来求m的n次方,求得结果为浮点类型.
- c语言for求一个数得n次方,C语言中表示一个数的次方怎样表?
2011-06-26 C语言里"/"在表示两个数相除时,具体是怎样运算的? 是不是取不超过代有小数点的商的最大整数啊? 那个"向下取整"具体是啥意思啊? C语言 ...
- 每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着
Pow(x, n) 原题链接Pow(x, n) 给定一个数,求n次方.n次方可以分解成两个n/2次方相乘,所以递归即可. class Solution { public:double myPow(do ...
- python双星号什么运算_Python3基础 双星号 求一个数的几次幂
镇场诗: ---大梦谁觉,水月中建博客.百千磨难,才知世事无常. ---今持佛语,技术无量愿学.愿尽所学,铸一良心博客. --------------------------------------- ...
- [算法]不使用*、/、+、-、%操作符求一个数的1/3
摘要:算法一直是程序员进阶的一道龙门,通常算法都是为了更高效地解决问题而创造的,但也有的只是出于学术性,并不在意其实际意义.这是近日在国外技术问答网站stackoverflow的一个热门问题,不知道你 ...
最新文章
- WebService大讲堂之Axis2(5):会话(Session)管理
- anaconda安装及环境变量配置
- 015 Android之可执行文件dex
- Ubuntu中配置NFS服务
- spring依赖注入的基本方法及其原理
- 正在启动python的代码补全客户端_Python交互模式下代码自动补全
- 软件测试--环境讲解
- 网络中计算机传输信息时所遵从的不同规则,2012年上海市高中学业水平考试信息科技试卷(第6套)...
- [梦]2005年9月1日
- Windows下pig-0.17启动时遇到的问题及解决
- BERT模型的结构,特点和实践
- javaWeb的分页
- android 录屏方案 VFR和CFR
- GD32 ADC功能及代码详解
- halcon学习易错系列—创建空的object对象算子gen_empty_obj
- 辉光管电子时钟DIY记录-动态扫描驱动方式
- DTS 宣布华硕 ROG Phone 将支持 DTS:X Ultra 技术
- 前后端分离微服务管理系统项目实战SaaS-HRM项目(九)——文件上传与PDF报表入门
- 最新各大apk加固特征库
- CAD数字求和lisp