import java.math.BigDecimal;
public class Main {
private static final BigDecimal A = BigDecimal.valueOf(4);
private static final BigDecimal B = BigDecimal.valueOf(5, 1);
private static final BigDecimal C = BigDecimal.valueOf(-191222921, 9);
private static BigDecimal a;
private static BigDecimal b;
private static int c;
private static boolean f(BigDecimal i, BigDecimal j, BigDecimal k, BigDecimal l, BigDecimal m) {
return i.compareTo(j) == 0 && k.compareTo(l) >= 0 && k.compareTo(m) <= 0;
}
private static boolean g(int i, int j, BigDecimal k) {
c = (c + i) % 4;
if (j == 0) {
BigDecimal l = a; BigDecimal m = b;
switch (c) {
case 0: a = a.add(k); return f(C, b, B, l, a);
case 1: b = b.add(k); return f(B, a, C, m, b);
case 2: a = a.subtract(k); return f(C, b, B, a, l);
case 3: b = b.subtract(k); return f(B, a, C, b, m);
default: return false;
}
} else {
--j;
k = k.divide(A);
return g(0, j, k) || g(1, j, k) || g(3, j, k) || g(3, j, k) || g(0, j, k) || g(1, j, k) || g(1, j, k) || g(3, j, k);
}
}
private static boolean h(int i) {
a = BigDecimal.ZERO; b = BigDecimal.ZERO; c = 0;
return g(0, i, BigDecimal.ONE);
}
public static void main(String[] args) {
int i = Integer.valueOf(args[0]);
System.out.println(!h(i) && h(i - 1) ? 1 : 0);
}
}
我想尝试一些不同于通常的哈希和随机函数的方法。您可以将数字作为命令行参数传递。1
如果给出正确的数字,则输出,0
否则给出。如果数量较少,您也可以在线尝试。
暗示:
该程序的主要部分实现了一种非常著名的算法的变体。一旦知道了它的作用,就可以优化给定的程序以计算密码。
说明:
该程序实现了众所周知的Koch曲线(来自Wikipedia的图片)的二次方(类型2)的遍历:
秘密数是不经过点(B,C)的第一次迭代。根据Nitrodon的正确认识,除了第一次迭代,我们可以安全地忽略曲线的所有部分的递归,这些递归不会通过给定点。通过相应地更改原始程序中的一行,即使在在线解释器中,我们也可以检查正确的号码。