数学奥林匹克数学之谜

时间:2015-07-24 16:11:45

标签: java math recursion backtracking

确定正整数的所有三元组(a,b,c),使得每个数字:ab-c,bc-a,ca-b是2的幂。

如何通过回溯来解决这个问题?试过但没有成功..

1 个答案:

答案 0 :(得分:0)

如果这是问题的确切定义,那么你就无法通过算法解决问题(至少,不是以虚拟的方式解决问题,比如回溯或蛮力),因为你不能#39;知道你的a,b,c参数的范围:你所知道的是它们是正整数,但那些是无限的!

如果有人告诉你:a,b,c都低于10 ^ 6,那么你可以这样做:

int limit = Math.pow(10, 6);
for (int a=1; a<=limit; a++) {
  for (int b=1; b<=limit; b++) {
    for (int c=1; c<=limit; c++) {
      if (CONDITION_IS_MET) {
        solutions.add(a, b, c);
      }
    }
  }
}

在满足条件的情况下,对所有组合的测试为2的幂。您可以通过计算二进制表示中的1的数量来测试数字是否是2的幂:如果它恰好是1(或0),则它是2的幂:

boolean isPowerOfTwo(int n) {
  String binary = Integer.toBinaryString(n);
  int count = 0;
  for (char c: binary.toCharArray()) {
    count+= c=='1' ? 1 : 0;
  }
  return count<=1;
}

鉴于它来自数学奥运会,可能有一些方法可以将问题写成一个方程式系统或类似关系,从而为您提供答案。你试过了吗?