如何在不应用诸如十进制到二进制转换的任何函数的情况下计算数字的0和1的数量?

时间:2019-09-02 04:02:01

标签: python

我想计算从0到value的数字中0和1的数量。 (在下面的代码中,该值为4,所以计数为0、1、2、3)。

如果n和value较大,则由于十进制到二进制计算中涉及的大量计算,将导致内存错误。


def decimalToBin(n):

    l=[]
    while(n>0):
        dig=n%2
        l.append(dig)
        n=n//2
    l.reverse()
    return l

def main():
    n=2

    value=2**n

    for i in range(value):

        l=decimalToBin(i)
        m=l.count(0)
        n=l.count(1)
        print(m,n)

main()

有什么方法可以在不实际将十进制应用于二进制转换的情况下了解0和1的计数。?

1 个答案:

答案 0 :(得分:0)

这是一个数学问题,本身不是编程问题,尽管对程序员来说是个好习惯。

让我们说n = 4并尝试看看我们是否注意到任何有趣的东西。因此,我们正在处理以下数字:

   0
   1
  10
  11
 100
 101
 110
 111
1000
1001
1010
1011
1100
1101
1110
1111

最简单的观察是最后一位切换每一行;它之前的位每2行切换一次;接下来的位每4行切换一次,而HSB在这里仅切换一次(每8行一次)。您可能要注意的下一件事是,因此,如果我们用前导零替换前导空格(即,如果将每一行都设置为4位数字),那么零将与1一样多。将有16个数字(2^n),每个有4位(n),所以总共有64位(2^n * n),其中32位是1,并且其余的32个将是0。因此问题就变成了:我们有多少个领导空间?

让我们首先考虑第一行,因为它有点反常-它是唯一以零开头的行,因为事实证明代表一个完全没有数字的数字会引起各种各样的问题。现在让我们假装逻辑上写的是零-没有数字(和四个前导空格)。那么,我们有什么?

最后一位只有一个前导空格,即“固定”第一行中的那个。
第二位有两个前导空格。
第三位有四个前导空格。
MSB具有八个前导空格。

因此,我们总共有1 + 2 + 4 + 8个前导空格,即152^4 - 1)。我们必须恢复我们的第一行修订,并减去一个前导空格(因为我们确实想将零写为0,而不是什么都不写),所以前导空格的正确数目是2^n - 2

因此我们知道2^n * n / 2位是1
而且我们知道2^n * n / 2 - (2^n - 2)位是0。这可以简化:2^n * (n / 2 - 1) + 2

最后,请注意,Python将指数写为**,而不是^(这是完全不同的东西)。所以...

num_of_ones = 2 ** n * n / 2
num_of_zeros = 2 ** n * (n / 2 - 1) + 2