首页 > 其他 > 详细

50. Pow(x, n) (编程技巧)

时间:2016-01-27 17:01:30      阅读:118      评论:0      收藏:0      [点我收藏+]

Implement pow(xn).

double sum = 1;
		if (n > 0) {
			while ((n--) > 0)
				sum *= x;
			return sum;
		} else if (n < 0) {
			while ((n++) < 0)
				sum /= x;
		}
		return sum;  //开始单纯的我是这样写的。超时了

  

	if (n == 0)           //想了一下,不就是求x+1000/x的最小值。自己运行都通过了,但是leetcode仍然显示超时,其实这样也不错,AC版的空间换时间了
			return 1;
		double sum = 1, tmp = 1;
		if (n > 0) {
			int sq = (int) Math.round(Math.sqrt(n));
			for (int i = sq; i > 0; i--)
				tmp *= x;
			// System.out.println(tmp);
			for (int i = 0; i < sq; i++)
				sum *= tmp;
			int i = n - sq * sq;
			// System.out.println(i);
			if (i > 0) {
				for (int j = 0; j < i; j++)
					sum *= x;
			} else if (i < 0) {
				for (int j = i; j < 0; j++)
					sum /= x;
			}
			return sum;
		} else {
			int m = Math.abs(n);
			int sq = (int) Math.round(Math.sqrt(m));
			for (int i = sq; i > 0; i--)
				tmp /= x;
			// System.out.println("tmp="+tmp);
			for (int i = 0; i < sq; i++)
				sum *= tmp;
			int i = n + sq * sq;
			// System.out.println(i);
			if (i > 0) {
				for (int j = 0; j < i; j++)
					sum *= x;
			} else if (i < 0) {
				for (int j = i; j < 0; j++)
					sum /= x;
			}
			return sum;
		}

  

public class Solution {            //虽然用了递归,挺巧妙的,一定要记得思想  & 和 >>
  public double myPow(double x, int n) {
  if (n == 0) return 1.0;
  if (n < 0) { x = 1 / x; n = ~n + 1; }
  if (n == 1) return x;
  if (n == 2) return x * x;
  if ((n & 1) == 1) return x * myPow(x * x, n >> 1);
  return myPow(x * x, n >> 1);
}
}

  

50. Pow(x, n) (编程技巧)

原文:http://www.cnblogs.com/kydnn/p/5163726.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!