蓝桥杯算法学习打卡
算法中的位运算
1.找出数组中唯一成对的那个数
2.二进制中1的个数
3.一条语句判断整数是不是2的整数次方
4.将整数的奇偶位互换
5.二进制表示浮点实数
1.找出数组中唯一成对的那个数
题目描述:
分析:
异或运算中,存在以下规则
x^x=0
x^0=x
自反性:A^A^B=0^B=B #连续和同一个因子异或,结果为自己
1001个数中有999个数只出现了一次,有1个数出现了两次,此题我们可以采用异或的知识
实现:
import random
N=1001
x=0
index=1
my_list=[int(i) for i in range(1,1001)] #生成一个列表,包含1-1000
n=random.randint(1,N) #随机生成一个1-1000的数,加入列表
my_list.append(n)
for i in range(1,N): #先用x=0去异或1-1000
x=x^index
index+=1
for i in my_list: #再用x去异或列表的每个元素(1-1000和那个重复的数)
x=x^i
#经过上述步骤列表中唯一的数被异或了两次结果为0,而唯二的数被异或了三次x^x^x=x
#print(my_list) 输出列表,可查看x的值等于列表末尾的元素
print(x)
2.二进制中1的个数
题目描述:
分析:
以9来说
1 0 0 1
- 1
----------
1 0 0 0
(1001)&(1000)=1000
1 0 0 0
- 1
----------
0 1 1 1
(1000)&(0111)=0000
#每次操作 n&(n-1) 的意义为消去二进制表示中最低位的一个1
#直到结果为0,二进制中的1则全部消去
代码:
n=int(input())
i=0
while n!=0:
n=(n-1)&n
i+=1
print(i)
#常规方法2
#10进制转2进制 bin() 10进制转8进制 oct() 10进制转16进制 hex()
m=int(input())
s=bin(m)
print(s)
print(s[2:].count("1"))
3.一条语句判断整数是不是2的整数次方
题目描述:
输入一个数,判断是不是2的整数次方
分析:
2的整数次方,例如0,2,4,8,16,32,64等
这些数的共同点就是他们的二进制表示中仅有一位是1,其他位全为0
此题可借用上题的方法
代码:
n=int(input())
if n&(n-1)==0:
print("yes")
else:
print("no")
4.将整数二进制表示的奇偶位互换
分析:
代码:
n=int(input())
ou=n&int('10101010',2)
ji=n&int('01010101',2)
print((ou>>1)^(ji<<1))
5.二进制表示浮点实数
题目:
分析:
此题是一个定式
拿0.625举例,配合着代码理解
0.625*2 =1.25 1.25大于1 在s后面接上1 返回1.25-1=0.25
0.25*2 =0.5 0.5小于1 在s后面接上0 返回0.5
0.5*2 =1 1等于0 在s后面接上1 返回1-1=0
结束
代码:
s="0."
#输入小于1的小数
n=float(input())
while n>0:
r=n*2
if r>=1:
s+="1"
n=r-1
else:
s+="0"
n=r
# if len(s)>34:
# print("error")
print(s)
注:文中题目及思路均来自蓝桥算法课,本文只是整理吸收,侵删