Java 布尔算法检查位数是否为偶数

Java boolean-algorithm to check wheter number of digits is even

我正在尝试编写一个递归方法,如果显示为二进制数的 n 的位数为偶数,则 returns 为真,如果为奇数,则为假。 如果它 returns 是一个布尔值,我真的不知道如何用递归方法计数。

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

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

如果指数是奇数则位数是偶数,如果是偶数则位数是奇数。但是我不能用我的布尔函数传递一个值,对吗?

应返回的一些示例:

  // 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);
}

这处理非负输入。对于负数,我可以争辩说你应该总是 return 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

您不需要计算数字,您只需要跟踪计数是奇数还是偶数。

boolean hasEvenDigitCount(long n) {
    if (n/2 == 0) { // handles both 1 and 0 as an even number of digits
        return false;
    }
    return !hasEvenDigitCount(n/2);
}

虽然Nelfeal 和Eran 的解决方案很好,但我想提一个通用的方法,在解决递归问题时,将中间结果作为附加参数携带。

 def isEvenLength (n: Long) : Boolean = {

     def isEvenLength (n: Long, sofar: Boolean) : Boolean = {
         if (n < 2) sofar else isEvenLength (n/2, !sofar) 
     } 

     isEvenLength (n, false) 
 }

我认为内部函数还没有达到 Java,所以在 Pseudo-Java 中,它看起来更像这样:

 static boolean isEvenLength (final long n, final boolean sofar) {
     if (n < 2) sofar else isEvenLength (n/2, !sofar);
 } 

 static boolean isEvenLength (final long n) {
     isEvenLength (n, false);
 }

所以可以通过向 sofar 加一来计算长度

 if (n < 2) sofar else isEvenLength (n/2, sofar+1)

使用(希望)int 作为到目前为止的类型。

作为黑客技巧,您可以在 java 中使用它(速度不快):

static boolean hasEvenLength(int n) {
    return Long.toBinaryString(n).length() % 2 == 0;
}