计算X的n次幂,有多种算法

例子:计算2的62次方。

method 1 :time = 1527 纳秒。

常规思路,进行61次的乘法!

private static long mi(long X, long n) {
long start = System.nanoTime();
long result = 1;
for (long k = 0; k < n; k++) {
result *= X;
}
System.out.println(System.nanoTime()-start);
return result;
}

method 2 :time = 113 纳秒

进行拆分:2^62 = (2^31)^2 = (2^31)*(2^31)         // 得到 2^31 的值的情况下,需要 1 次乘法

     2^31 = (2^15)^2*2 = (2^15)*(2^15)*2   //  得到 2^15 的值的情况下,需要 2 次乘法

       2^15 = (2^7)^2*2 = (2^7)*(2^7)*2       //  得到 2^7 的值的情况下,需要 2 次乘法

       2^7 = (2^3)^2*2 = (2^3)*(2^3)*2        //  得到2^3 的值的情况下,需要 2 次乘法 

     2^3 = 2*2*2                //  …………………………,需要2次乘法

所以:该方法需   2+2+2+2+1 = 9 次乘法!

     /**
* 求x的n次方的值。
* 幂函数:
* x的n次幂
* @param x
* @param n
* @return
*/
public static long pow(long x, long n) { long start = System.nanoTime();
if (n == 0) {
System.out.println(System.nanoTime()-start);
return 1;
}
// 如果是偶数
if (isEven(n)) {
return pow(x * x, n / 2);
} else {
return pow(x * x, n / 2) * x;
}
} /**
* 判断x是否是偶数
*
* @param x
* @return
*/
private static Boolean isEven(long x) {
if (x % 2 == 0) {
return true;
}
if (x % 2 == 1) {
return false;
}
return false;
}

幂的运算:X的n次幂的更多相关文章

  1. P2699 【数学1】小浩的幂次运算

    原题链接 https://www.luogu.org/problemnew/show/P2699 P2699 [数学1]小浩的幂次运算 首先第一眼看这个题就知道要暴力枚举w^i 看是否在区间[l,r] ...

  2. (分治法 快速幂)P1226 【模板】快速幂||取余运算 洛谷

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 输入输 ...

  3. 求幂&&快速幂&&位运算

    1.普通的求幂方法: 时间复杂度为O(n),对于比较大的数在1s限时内可能会TLE int pow(int base,int p){ int ans=1; for(int i=1;i<=p;i+ ...

  4. 矩阵快速幂——将运算推广到矩阵上HDU 1575

    /* 本题的思路比较简单,就是将递推公式写出来,然后表达成为一个矩阵的形式 最后通过计算就可以得到一个符合题目要求的矩阵, 然后就是将矩阵上面所有的对角线元素相加 得到的结果即为所求的目标 */ #i ...

  5. 洛谷P2699小浩的幂次运算

    二分走一波,没想到题解的大佬做法 p_q 注意爆long long,所以先对数取一下上限 二分确定下限,然后输出 #include<stdio.h> #include<math.h& ...

  6. BigDecimal 的幂次方运算

    public static void main(String[] args){ BigDecimal bg1, bg2; bg1 = new BigDecimal("200000.45&qu ...

  7. hdu 1575 求一个矩阵的k次幂 再求迹 (矩阵快速幂模板题)

    Problem DescriptionA为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input数据的第一行是一个T,表示有T组数据.每组数据的第一行有 ...

  8. POJ1026 Cipher(置换的幂运算)

    链接:http://poj.org/problem?id=1026 Cipher Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  9. cf352E Jeff and Brackets dp+矩阵快速幂(加法+min运算)

    题意大致是这样的,一共要放 m 段括号序列,每一段放 n 个括号,也就是放 n*m个括号,再每一段中的 n 个位置分别有放左括号和右括号的代价,问最终摆放出合法的括号序列的最小代价是多少. 另外保证, ...

随机推荐

  1. 解决 Android Device Monitor 常见问题

    Ø  简介 什么是 Android Device Monitor,中文意思就是安卓设备监视器,用于管理安装设备(手机.模拟器)用的.下面列出 Android Device Monitor 常见的一些问 ...

  2. 解决yum安装mysql时Requires: libc.so.6(GLIBC_2.17)(64bit)

    1.yum install mysql-community-server 1 2 3 4 5 6 7 Error: Package: mysql-community-libs-5.7.17-1.el7 ...

  3. 割点判断+luogu 3469 POI2008 BLO

    1.根节点,有2棵及以上子树 2.非根节点,有子节点dfn[u]<=low[v] #include <bits/stdc++.h> #define N 1000050 using n ...

  4. Ubuntu中创建、删除、更改、移动文件的命令

    1.创建一个目录 $ sudo mkdir <目录名>   2.删除一个非空目录下的一切 $ sudo rm -rf <目录名>   3.将文件file1,更改文件名为file ...

  5. QWidget-控件层级关系

    lower()     将控件降低到最底层 raise_()     将控件提升到最上层 label.raise_() a.stackUnder(b)    让a放在b下面 注意:以上操作专指同级控件 ...

  6. Linux基础学习【规则与安装】

    一.主分区.扩展分区与逻辑分区的特性: 主分区与扩展分区最多可以有4个(硬盘的限制) 扩展分区最多只能有1个 逻辑分区是由扩展分区持续切割出来的分区 能够被格式化后作为数据访问的分区为主分区和逻辑分区 ...

  7. KeyUp 和KeyDown 、KeyPress之间的区别

    keydown:用户在键盘上按下某按键是发生.一直按着某按键则会不断触发(opera浏览器除外). keypress:用户按下一个按键,并产生一个字符时发生(也就是类似shift.alt.ctrl之类 ...

  8. bind,unbind,one

    刚开始我们先看一下它的定义: .bind( eventType [, eventData], handler(eventObject)) .Bind()方法的主要功能是在向它绑定的对象上面提供一些事件 ...

  9. 异步Async

    1.c#异步介绍 异步必须基于委托,有委托才有异步 新建一个window Form程序MyAsync,添加一个按钮,(name)=btnAsync 后台代码如下: using System;using ...

  10. 顶层const

    顶层const:指针本身是一个常量 底层const:指针所指对象是一个常量 顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型.类.指针等 底层const则与指针和引用等复 ...