今天在群里看到这样一道程序题:
设计一个程序,将十进制数转换为二进制数,并统计二进制数中的0和1的个数,对比个数,如果1的个数大于0的个数,则为A类数,反之则为B类数。
统计出1到1000的A类数和B类数的个数。
见到这道题,我的第一反应就是,转换为二进制之后,转为字符,通过切片统计,遍历或者通过count方法统计0和1的个数得出结果。
示例:
num=1
A=0
B=0
An=0
Bn=0
while num<=1000:
snum=str(bin(num)).split(str(bin(num))[0:2])[1]#此处多次截取是为了去掉十进制转换为二进制再转换为字符后头部多出的0b标识
for s in snum:
if s == "1":
A+=1
else:
B+=1
num+=1
if A>B:
An+=1
else:
Bn+=1
A = 0
B = 0
print(f"A类数有:{An}个")
print(f"B类数有:{Bn}个")
相比于这种方法,需要多次转换截取,群友提供了另一个思路。
十进制转二进制一般都会采用一个方法,即除二取余倒排,那么就可以不用别的方法来转换二进制,在代码中也采用这个方法,对数值进行反复的对二取余,每取一次余数都做一次统计,并将原数整除2。这样同样可以得到正确的结果,且简单方便了许多。
示例:
a=1
a1=0
a2=0
n1=0
n2=0
while a<=1000:
b=a
while a:
if a%2:
a1+=1
else:
a2+=1
a//=2
a=b+1
if a1>a2:
n1+=1
else:
n2 += 1
a1 = 0
a2 = 0
print(f"A类数有:{n1}个")
print(f"B类数有:{n2}个")
Comments | NOTHING