一.什么是快速幂运算?
举一个例子,。
如果进行x*x*x*x.......,需要运算次,这是一个非常大的数字,代表着运算时间会非常长。
如果令
按照这个规律,我们只需要进行不到32次运算就可以得到结果了。
二.算法实现。
这是一个带有记忆性的快速幂运算。
public static double myPow(double x, int n) { Map map = new HashMap<>(); return myUtil(x,n,map); } public static double myUtil(double x, int n,Map map){ int k = 0; if (n<0){ n = Math.abs(n); k=1; } if (n==0){ return 1; } if (n==1){ if (k==0) { map.put(1, x); return x; }else { map.put(1, 1/x); return 1/x; } } if (n==2){ if (k==0) { map.put(2, x * x); return x * x; }else { map.put(2, 1/(x * x)); return 1/(x * x); } } if (map.get(n)!=null){ return (double) map.get(n); } if (n%2==0){ if (k==0) { map.put(n, (myUtil(x, n / 2, map)) * (myUtil(x, n / 2, map))); return (myUtil(x, n / 2, map)) * (myUtil(x, n / 2, map)); }else { map.put(n, ((myUtil(x, -n / 2, map)) * (myUtil(x, -n / 2, map)))); return (myUtil(x, -n / 2, map)) * (myUtil(x, -n / 2, map)); } }else { if (k==0){ map.put(n,myUtil(x,n/2,map) * myUtil(x,(n/2+1),map)); return myUtil(x,n/2,map) * myUtil(x,(n/2+1),map); }else { map.put(n,myUtil(x,-n/2,map) * myUtil(x,-(n/2+1),map)); return myUtil(x,-n/2,map) * myUtil(x,-(n/2+1),map); } } }