我想计算从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的计数。?
答案 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个前导空格,即15
(2^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