计算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. es6写法

    我们在日常开发中,如果我们使用es5则可以直接在浏览器里面写JavaScript脚本.一点问题也没有. 但是在写es6语法的JavaScript代码的时候,我们就需要引入babel翻译器了. 例如: ...

  2. node之http模块总结

    [文档归档文] 参考文献:https://nodejs.org/dist/latest-v6.x/docs/api/http.html

  3. namecheap域名设置Cloudflare为第三方DNS

    待更……等我搞完了就来写总结

  4. luogu P4183 [USACO18JAN]Cow at Large P

    传送门 首先考虑N^2做法,每次从一个点出发,如果到达一个点,然后到达这个点的时间\(\le\)离这个点最近的叶子距离\(di_x\),那么答案+1,否则继续找点 这个暴力很不好优化.可以这样认为,如 ...

  5. python常用模块之os模块

    全部参考~~~~~~~ 1. 解释说明版:https://www.cnblogs.com/yufeihlf/p/6179547.html 2. 简洁版: https://www.cnblogs.com ...

  6. python 的基础 学习 第四天 基础数据类型

    1,数字 int 数字主要是用于计算,使用方法并不是很多,就记住一种就可以. #bit_length() 当十进制用二进制表示时,转化为最少二进制的最少位数v = 11data = v.bit_len ...

  7. CSS公共清除浏览器默认样式

    /*Vue隐藏*/ [v-cloak] { display: none; } /*清除样式*/ body, ol, ul, dl, li, dt, dd, h1, h2, h3, h4, h5, h6 ...

  8. HttpWebResponse 解压gzip、deflate压缩

    需要使用到两个Stream的子类:GZipStream.DeflateStream,代码如下: public string GetResponseBody(HttpWebResponse respon ...

  9. 【blog】谷歌浏览器如何设置编码

    解释 55.0.2883.75 版本之后的chrome的更多工具菜单项里就没有编码设置了,理由据说是使用率比较低,促进网页编码规范.google 真是脑抽了,普通用户也许很少遇到默认编码错误显示出现乱 ...

  10. Css/Js推荐类库

    animate.css https://daneden.github.io/animate.css WOW.js http://mynameismatthieu.com/WOW owl.carouse ...