Pow(x, n) 求一个数的n次方
2014-03-07 09:50
495 查看
我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目。
所需数学知识:
大致考虑正数,0,负数即可。n多个数相乘的问题。
1.简单For循环
这还不简单,马上写一个for循环:
搞不好比for循环还要慢。
都先考虑正数。我们在想,n多个2相乘,如果n刚好能被2整除,我们可以把n分成一半一半来考虑。
可以把它们想成是一半*一半,不能被2整除的话,也只是多乘以一个自己。
我们知道这里的 n / 2,和 n % 2还可以用位运算来提高速度
n / 2 == n >> 1 (在返回是int值的情况下)
n % 2 == n&1
修改如下:
4.当然还有优化空间!
3标题中我们其实做的事情是对n的每次取半再相加,这样太慢了,直接除以2比较快。当然遇到不能整除的要多乘以一个自己。
通过位运算优化后就是:
看了下vs中的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次方
相关文章推荐
- 【面试题】剑指offer11--求一个数的指数次方,模拟实现一个pow函数
- 判断一个数是不是3的n次方
- 快速幂判断一个数的k次方是否超过另个数容易错误。。
- [LintCode] Pow(x, n) 求x的n次方
- 面试:快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!
- 在java中, 一个数左移n位,就是将这个数乘以2的n次方,右移就是将这个数除以2的n次方怎么理解?
- 如何判断一个数是否是2的n次方
- c语言==判断一个数是否为2的整数次方【不使用循环】(23)
- 快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方! .
- C语言10的n次方pow函数不好用,自己写一个简单的
- 编程数学(A-1)-(B-1)-一个数的负次方怎么算
- pow()函数中求次方的代码,分别用 for 循环和 while 作解析
- 《剑指offer》:自己写一个pow函数
- 面试题 判断一个数是否为2的n 次方
- 判断一个数是不是2的n次方
- The Super Powers UVA 11752 分析分析 求无符号长整形以内的数满足至少可以用两种不同的次方来表示。比如64 = 2^6 = 8^2; 一个数的1次方不算数。
- 数值的整数次方double pow(double base,int exponent)求base的exponent次方 不考虑大数 不准用库函数
- 每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着
- pow() 函数返回 x 的 y 次方