Java boolean 算法检查位数是否为偶数

标签 java algorithm recursion boolean digits

我正在尝试编写一个递归方法,如果显示为二进制数的 n 的位数为偶数,则返回 true,如果为奇数,则返回 false。 如果递归方法返回 boolean 值,我真的不明白如何计算它。

我认为部分解决方案是检查数字是否为 2 的幂:

static boolean isPowers2(long n) {
    if (n % 2 != 0) return false;
    if (n / 2 == 1) return true;
    return isPowers2(n / 2);
}

如果指数是奇数则位数是偶数,如果是偶数则位数是奇数。但是我不能用 boolean 函数传递值,对吧?

应返回的一些示例:

  // evenCount(0B0    ) is false
  // evenCount(0B1    ) is false
  // evenCount(0B10   ) is true
  // evenCount(0B11   ) is true
  // evenCount(0B100  ) is false
  // evenCount(0B111  ) is false
  // evenCount(0B1000 ) is true
  // evenCount(0B1010 ) is true
  // evenCount(0B10000) is false
  // evenCount(0B10110) istfalse

这是我在大学算法测试中失败的问题,我仍然无法弄清楚如何解决它。我希望有人能给我一个关于如何解决这个问题的提示......

最佳答案

检查输入是否为 2 的幂是无关紧要的。您应该编写一个递归方法,在每次调用中删除一位。

一个数的二进制长度为偶数,前提是当你从它中删除一位时它的长度为奇数。

static boolean hasEvenLength(int n)
{
    if (n<2) { // single digit
        return false;
    }
    return !hasEvenLength(n/2);
}

这处理非负输入。对于负数,我认为您应该始终返回 true,因为最高有效位(符号位)始终已设置,因此您可以说该数字有 32 个二进制数字。

下面是该方法对 0 到 99 之间所有数字的输出:

0 0 false
1 1 false
2 10 true
3 11 true
4 100 false
5 101 false
6 110 false
7 111 false
8 1000 true
9 1001 true
10 1010 true
11 1011 true
12 1100 true
13 1101 true
14 1110 true
15 1111 true
16 10000 false
17 10001 false
18 10010 false
19 10011 false
20 10100 false
21 10101 false
22 10110 false
23 10111 false
24 11000 false
25 11001 false
26 11010 false
27 11011 false
28 11100 false
29 11101 false
30 11110 false
31 11111 false
32 100000 true
33 100001 true
34 100010 true
35 100011 true
36 100100 true
37 100101 true
38 100110 true
39 100111 true
40 101000 true
41 101001 true
42 101010 true
43 101011 true
44 101100 true
45 101101 true
46 101110 true
47 101111 true
48 110000 true
49 110001 true
50 110010 true
51 110011 true
52 110100 true
53 110101 true
54 110110 true
55 110111 true
56 111000 true
57 111001 true
58 111010 true
59 111011 true
60 111100 true
61 111101 true
62 111110 true
63 111111 true
64 1000000 false
65 1000001 false
66 1000010 false
67 1000011 false
68 1000100 false
69 1000101 false
70 1000110 false
71 1000111 false
72 1001000 false
73 1001001 false
74 1001010 false
75 1001011 false
76 1001100 false
77 1001101 false
78 1001110 false
79 1001111 false
80 1010000 false
81 1010001 false
82 1010010 false
83 1010011 false
84 1010100 false
85 1010101 false
86 1010110 false
87 1010111 false
88 1011000 false
89 1011001 false
90 1011010 false
91 1011011 false
92 1011100 false
93 1011101 false
94 1011110 false
95 1011111 false
96 1100000 false
97 1100001 false
98 1100010 false
99 1100011 false

关于Java boolean 算法检查位数是否为偶数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48549826/

相关文章:

java - 在Windows中从命令行运行java的问题

java - 检查两个顶点是否相连

arrays - 使用递归以螺旋模式遍历二维数组

php - 如何在数据库中实现文件夹,子文件夹

java - 如果发生无限递归,如何让递归函数返回 false

java - Android BLE 中未调用 onBatchScanResults

java - 难以构造 Arraylist 方法

java - 设计多模块项目

c++ - 快速中值更新算法

algorithm - 为什么下面的代码有 o(logn) 的时间复杂度