1、循环傻乘

2、递归调用

比如3^5(3的5次幂),利用递归每次减半相乘。

/*** 递归* 例如:我们想求3的8次幂是多少,3^8=?* 思路:我们可以将问题拆分,转换为* 3^8 = (3^4) * (3^4)* = (3^2 * 3^2) * (3^2 * 3^2)* = (3 * 3) * (3 * 3) * (3 * 3) * (3 * 3)* 偶数:* f(3,8)* => f(9, 8/2)* => f(81, 4/2)* => f(6561, 2/2)* => 6561 * f(6561 * 6561, 1/2) 返回* 奇数:* f(3,9)  因为奇数只比偶数多出一个底数。所以减去一个底数按偶数计算,最后把偶数算出来的结果在乘上一个底数即可* => 3 * f(9, (9-1)/2)* => f(81, 4/2)* 其余与偶数一致....** @param x 底数* @param n 次幂* @return 计算结果*/public static double powerRecursion(int x, int n) {// 如果n为0,则直接返回1。例如:2^0=1;3^0=1依次类推if (n == 0) {return 1;}// 如果n为负数,则转为倒数。例如:2^-2=1/4;3^-3=1/27以此类推if (n < 0) {return 1 / powerRecursion(x, Math.abs(n));}// 如果n为奇数,n%2==1 则为奇数,或者使用 n&1 == 1 也可以,(n >> 1 << 1) == n 就是看数字的二级制最后一位是否是1if (n % 2 == 1) {// 如果是奇数的话return x * powerRecursion(x * x, (n - 1) / 2);}// 偶数return powerRecursion(x * x, n / 2);}

3、循环

/*** 循环* 如果我们求2^5的话,表示成二级制为00100000。 2^0<<5向左移动5位 , 00000001 => 00100000* 00100000 = (0*2^7) + (0*2^6) + (1*2^5) + (0*2^4) + (0*2^3) + (0*2^2) + (0*2^1) + (0*2^0)* 求3的5次幂 3^5 = ?* 思路:将3^5进行拆分 3^5 = 3^4 * 3^1** 首先将5转换成2进制 = 00000101 将二进制拆分成多个2的等次幂。即二进制位只能存在一个1.* 00000101 = 00000100 + 00000001;* 怎么拆分呢?只要判断二级制末尾是否为1即可,如果为1则将结果相乘。 计算完成后,对二进制位再向右位移1位,依次进行。* .......第4位=>3^16、第3位=>3^8、第2位=>3^4、第1位=>3^2、第0位=>3^1*  由于5对应的二进制上只有第0、2位上是1,所以将0、2位对应的值相乘。即3^4*3^1* @param x 底数* @param n   次幂* @return    结果*/public static double powerLoop(int x, int n) {// 如果小于0求倒数if (n < 0) {x = 1 / x;n = -n; // n = Math.abs(n)}// 声明结果double result = 1;while (n != 0) {if ((n & 1) != 0) {result *= x;}x *= x;n >>= 1;}return result;}

Power算法求X的N次幂相关推荐

  1. 08、求x的y的幂次方的最后3位数——循环

    求x的y的幂次方的最后3位数 求x的y的幂次方的最后3位数 程序代码如下: /*2017年3月12日14:07:05功能:程序求x的y的幂次方的最后3位数*/#include"stdio.h ...

  2. 求某数0次幂到n次幂之和

    //求某数0次幂到n次幂之和,如(2的0次幂+2的1次幂+2的2次幂之和) /** * 思路:幂运算,如2的2次幂=2*2,3的3次幂=3*3 * 外循环实现幂次数,如n的3次幂, * 内循环做运行, ...

  3. 求实数的整数次幂(循环版)(高效)(位运算解题)

    求实数的整数次幂(循环版)(高效) (10 分) 原理图: 请编写函数,用循环语句以最快的方法求任意实数的任意整数次幂. 函数原型 double Power(double x, int n); 说明: ...

  4. 求a的b次幂的最后3位(难度:1颗星)

    问题描述: 输入a,b,其中a和b的范围是[2,999999999],求出a的b次幂的最后3位. PS: 如果最后三位是001,那么输出1就可以了. 问题分析: 这个问题的实际上是求a的b次幂mod ...

  5. 树上问题(一)倍增算法求最近公共祖先

    倍增算法求最近公共祖先 一.概述 在图论和计算机科学中,最近公共祖先 LCA(Least Common Ancestors)是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点.在这里,我们 ...

  6. C语言不使用pow实现求x的y次幂(次方)

    先来介绍下pow 头文件:#include <math.h> pow() 函数用来求 x 的 y 次幂(次方),x.y及函数值都是double型 ,其原型为:     double pow ...

  7. 合一算法求最一般合一_如何设置RetroArch,最终的多合一复古游戏模拟器

    合一算法求最一般合一 Do you wish you could browse a massive collection of retro games from your couch, without ...

  8. Matlab实现连通域标记算法求图像连通域

    Matlab实现连通域标记算法求图像连通域 连通域 连通域标记算法 连通域 连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域(Regi ...

  9. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  10. python最小生成树算法_图算法|Prim算法求最小生成树

    01 - 一个实际问题 要在n个城市之间铺设光缆,要求有2个: 这 n 个城市的任意两个之间都可以通信: 铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此要使铺设光缆的总费用最低. 如下所示 ...

最新文章

  1. 坑系列 --- 时间和空间的平衡
  2. python3.7安装-Linux安装python3.7
  3. 基于微服务架构的token生成和使用
  4. PAT乙级(1008 数组元素循环右移问题)
  5. java下载网络文件_java下载网络文件的方法有哪些
  6. redis logfile 只读_docker 配置redis主从,哨兵sentinel
  7. fgo7.27服务器维护,【公告】更新游戏数据资料(7/27 实施)
  8. 通过Spannable对象设置textview的样式
  9. php基础知识和函数
  10. python中怎样获得unicode_如何在Python中获取unicode月份名称?
  11. 银监计算机类考试题库,干货!国考银监会财经类面试题库
  12. 杭州市直职称计算机考点地址,杭州中级会计考试地点在哪里
  13. moment.js时间格式转换
  14. TXT文件导入mysql
  15. 下载并安装 Metricbeat
  16. 在 LaTeX 中直接作图:Picture环境
  17. 《第一行代码》中遇到的问题
  18. linux系统下,Failing to install python-igraph
  19. C语言求解一元二次方程组
  20. 新人贴:MATLAB 错误使用 surf (line 74) X、Y、Z 和 C 不能是复数。

热门文章

  1. GitHub上万星:超精细的漫画上色AI,老婆画风任你选择,登上了趋势榜
  2. MMO游戏开发 --前言
  3. 用一报还一报(TIT FOR TAT)策略的胜利指导我们的生活和人际交往
  4. 用英文字母解析漩涡鸣人
  5. java麻将算法_Java实现的麻将胡牌算法
  6. 19年恶意软件排行榜
  7. 什么是前端,前端是什么?
  8. 计算机u盘 硬盘无法读取,U盘在电脑上读取不出来怎么办?
  9. 通过深度学习实现对网络异常流量检测
  10. Matlab 校验方法