解决方案 »
- 文件系统 缺省系统 (org-netbeans-api-project-libraries/Libraries)中已存在文件
- 请教一下,静态存储区内放的是什么?方法区和堆的区别在哪里?
- 刚学JAVA就出了错误.菜鸟急求大虾
- struts中传参数问题?
- request对象的问题。。求解答。。谢谢。
- J2SE在实际工作中有用吗?即将毕业,我现在学得好郁闷!
- 消除编译时的警告?
- 关于加号与等号的动作监控过程不清楚?请高手看看。
- 为什么如下方法把inputstream转为String的时候会出错?
- 请问,我用String str2 = new String(rs.getString(2).getBytes("ISO8859_1"),"gb2312");为什么总抱错啊??
- 级联关系查询怎么解决HIBERNATE SESSION关闭
- 怎么样区分数组和对象
计算一个 double 的 int 次方,以 O(lgN) 复杂度实现。辗转相除法求两个数的最大公约数大家肯定都会,那如何求三个数的最大公约数呢?
这题目出得很好!大家可以想一想。答案可以参考我一个月前的一个blogECPP——利用有限域上的椭圆曲线,精确判定素数的算法那篇里面有个用java实现的模幂算法,复杂度为O(lgN)。把“模”相关的去掉,剩下的“幂”,也就是多少次方了。那就是分治算法了,我把求椭圆曲线的次方的函数贴在下面,看看能否给大家以提示:
1. static public Point multiply(Point p, int x, Line l) throws EllipticException {
2. mapResult.clear();
3. // mapResult.put(1, p);
4. return multiply(p, x, l, mapResult);
5. }
6. static private Point multiply(Point p, int x, Line l, Map<Integer, Point> mapResult)
7. throws EllipticException {
8. if (x == 1)
9. return p;
10. if (mapResult.containsKey(x))
11. return mapResult.get(x);
12. int half = x / 2;
13. while (half > 0) {
14. try {
15. Point point = plus(multiply(p, half, l, mapResult), multiply(p, x - half, l,
16. mapResult), l);
17. mapResult.put(x, point);
18. return point;
19. } catch (EllipticException ee) {
20. half--;
21. }
22. }
23. throw new EllipticException("can't multiply " + p + "*" + x + " mod " + l.p);
24. }
请注意15行,典型的分治算法。
double n1 = pow(2, 6);
double n2 = pow(2, -6);
System.out.println(n1);
System.out.println(n2);
} public static double pow(double base, int exponent) {
if (exponent < 0)
return 1 / pow(base, -exponent);
double power = 1;
while(exponent > 0) {
if((exponent & 1) == 1) {
power *= base;
}
base *= base;
exponent >>= 1;
}
return power;
}
}
可以这么想象,把exponent当成2进制数,那么这个判断就是判断当前最低位是不是1?如果是0,就不用累乘。exponent >>= 1;
就是除以2了