我们知道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次方相关推荐

  1. c语言一个数的n次方,Pow(x, n) 求一个数的n次方

    我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目. 所需数学知识: 大致考虑正数,0,负数即可.n多个数相乘的问题. 1.简单For循环 这还不简单,马上写一个for循环:d ...

  2. 使用 Math.pow()方法,求出 2 的 32 次方的值

    java基础题 使用 Math.pow()方法,求出 2 的 32 次方的值 ```java //1.使用 Math.pow()方法,求出 2 的 32 次方的值. //static double p ...

  3. (Java蓝桥杯算法)给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。

    [问题描述] 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次: [输入格式] ...

  4. k次方 求1个数的n次方的前三位数和后三位数

    K次方 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submissio ...

  5. Java中求一个数的幂次方

    Java中求 m 的 n 次方不能使用 m^n,可使用 Math.pow(m, n) 来求m的n次方,求得结果为浮点类型.

  6. c语言for求一个数得n次方,C语言中表示一个数的次方怎样表?

    2011-06-26 C语言里"/"在表示两个数相除时,具体是怎样运算的? 是不是取不超过代有小数点的商的最大整数啊? 那个"向下取整"具体是啥意思啊? C语言 ...

  7. 每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着

    Pow(x, n) 原题链接Pow(x, n) 给定一个数,求n次方.n次方可以分解成两个n/2次方相乘,所以递归即可. class Solution { public:double myPow(do ...

  8. python双星号什么运算_Python3基础 双星号 求一个数的几次幂

    镇场诗: ---大梦谁觉,水月中建博客.百千磨难,才知世事无常. ---今持佛语,技术无量愿学.愿尽所学,铸一良心博客. --------------------------------------- ...

  9. [算法]不使用*、/、+、-、%操作符求一个数的1/3

    摘要:算法一直是程序员进阶的一道龙门,通常算法都是为了更高效地解决问题而创造的,但也有的只是出于学术性,并不在意其实际意义.这是近日在国外技术问答网站stackoverflow的一个热门问题,不知道你 ...

最新文章

  1. WebService大讲堂之Axis2(5):会话(Session)管理
  2. anaconda安装及环境变量配置
  3. 015 Android之可执行文件dex
  4. Ubuntu中配置NFS服务
  5. spring依赖注入的基本方法及其原理
  6. 正在启动python的代码补全客户端_Python交互模式下代码自动补全
  7. 软件测试--环境讲解
  8. 网络中计算机传输信息时所遵从的不同规则,2012年上海市高中学业水平考试信息科技试卷(第6套)...
  9. [梦]2005年9月1日
  10. Windows下pig-0.17启动时遇到的问题及解决
  11. BERT模型的结构,特点和实践
  12. javaWeb的分页
  13. android 录屏方案 VFR和CFR
  14. GD32 ADC功能及代码详解
  15. halcon学习易错系列—创建空的object对象算子gen_empty_obj
  16. 辉光管电子时钟DIY记录-动态扫描驱动方式
  17. DTS 宣布华硕 ROG Phone 将支持 DTS:X Ultra 技术
  18. 前后端分离微服务管理系统项目实战SaaS-HRM项目(九)——文件上传与PDF报表入门
  19. 最新各大apk加固特征库
  20. CAD数字求和lisp

热门文章

  1. dev grid 常用方法
  2. PHP代码重用与函数编写
  3. 简单理解 unix (liunx)inode
  4. Centos6.6系统root用户密码恢复案例(转)
  5. android4.0蓝牙使能的详细解析 (转载)
  6. *.sln和*.suo文件的作用
  7. JavaScript 中的函数式编程实践
  8. 20190226work
  9. VertrigoServ 2.21配置phpmyadmin
  10. SSH登陆的原理分析和免登陆设置!