当前位置: 首页 > article >正文

蓝桥杯 之 填空题-位运算与循环

文章目录

  • 循环
    • 握手问题
    • 门牌制作-循环
    • 小球反弹
    • 幸运数
    • 艺术与篮球
    • 跑步
  • 位运算
    • 3个1
    • 美丽的2024

位运算
在这里插入图片描述

可以关注这个Lowbit(x)

在这里插入图片描述

如何判断最低位是否是1? num&1 == 1就说明num最低位是1

循环

循环

握手问题

握手问题

在这里插入图片描述

思路分析: 可以直接计算出来,但是我们也同时可以用循环进行模拟

# 使用逆向思维
# 全部都握手-7人之间的相互握手
ans = 0
for i in range(1,50):
  ans+=i
# 7个人之间相互握手
ans1 = 0
for j in range(1,7):
  ans1+=j
print(ans-ans1)
# 答案是1204
  • 模拟的代码
ans = 0
for i in range(1, 51):
  for j in range(i+1, 51):
    if i <= 7 and j <= 7:
      continue
    else:
      ans += 1

门牌制作-循环

门牌制作

在这里插入图片描述

思路分析:可以通过数学规律进行求解,但是也可以暴力循环计算

# 直接模拟
from collections import  Counter
num = []

for i in range(1,2021):
  s = list(str(i))
  num.extend(s)

countnum = Counter(num)
print(countnum['2'])
# 答案624

小球反弹

小球反弹

在这里插入图片描述

思路循环:关键在于运动的分解!!

在这里插入图片描述

def check(a, b):
    if a % b == 0 and (a // b) % 2 == 0:
        return True
    return False

import math
t = 1
LA , LB = 0,0
while True:
    LA = 15*t
    LB = 17*t
    # if LA % 343720 == 0 and (LA//343720) % 2 == 0 and LB % 233333 == 0 and (LB//233333) % 2 == 0:
    if check(LA,343720 ) and check(LB,233333):
        break
    t+=1
print(math.sqrt(LA**2 + LB**2))

幸运数

幸运数

在这里插入图片描述

思路分析:直接暴力求解

end = 100000001
ans = 0
def manzu(num):
    a = list(map(int,str(num)))
    n = len(a)
    if n % 2 == 1:
        return False
    if sum(a[:n//2]) == sum(a[n//2:]):
        return True
    return False

for i in range(1,end):
    if manzu(i):
        ans+=1
print(ans)


# 4430091

艺术与篮球

艺术与篮球

在这里插入图片描述

思路分析:直接暴力模拟即可

# 先建立映射表
# 闰年的计算,能够被4整除但是不能被100整除,或者能够被400整除
# 笔画对应
mat = {"0":13,"1":1,"2":2,"3":3,"4":5,"5":4,"6":4,"7":2,"8":2,"9":2}
day = {1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
ans1,ans2 = 0,0
def run(year):
    if (year % 4 == 0 and year % 100 != 0 ) or (year % 400 == 0):
        return True
    else:
        return False
def cal(num):
    a = list(num)
    suma = 0
    for i in a:
        suma += mat[i]
    if suma  > 50:
        return True
    else:
        return False
for y in range(2000,2024):
    s1 = str(y)
    for m in range(1,13):
        s2 = str(m)
        if m <10:
            s2 = "0" + s2
        d = day[m]
        if run(y) and m == 2:
            d+=1
        for i in range(1,d+1):
            s3 = str(i)
            if i < 10:
                s3 = "0" + s3
            if cal(s1+s2+s3):
                ans1+=1
print(ans1)
# 3185
# 现在计算20240101到20240413
for y in range(2024,2025):
    s1 = str(y)
    for m in range(1,5):
        s2 = str(m)
        if m <10:
            s2 = "0" + s2
        d = day[m]
        if run(y) and m == 2:
            d+=1
        if m == 4:
            d = 13
        for i in range(1,d+1):
            s3 = str(i)
            if i < 10:
                s3 = "0" + s3
            if cal(s1+s2+s3):
                ans2+=1
# 43个
print(ans2)
print(ans1+ans2)
# 3228

跑步

跑步

在这里插入图片描述

思路分析:通过模拟循环暴力即可,不过得学会怎么求解当天是否是周末

from datetime import  datetime
from datetime import timedelta
# 还是暴力求解,不过得知道哪几天是周六与周日
# 就得使用到这个datetime
day = {1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
# 31天的月份有1,3,5,7,8,10,12
# 还是得遍历
ans2 = 0
for m in range(1,13):
    d = day[m]
    for i in range(1,d+1):
        start1 = datetime(2022,1,1)
        t1 = datetime(2022,m,i) - start1
        da = t1.days
        # 分别是周六和周日
        if da % 7 == 0 or da % 7 == 1:
            ans2+=1
            continue
        # 当不满足周末的情况下
        if  i in {1,11,21,31}:
            ans2+=1
print(ans2)
# 138

位运算

3个1

在这里插入图片描述

思路分析:学会统计一个十进制数中转化为二进制的形式里面1的个数


# 直接暴力求解
# 位运算要学会移位运算
# 统计num二进制里面的1的个数
def cal1(num):
    count = 0
    while num > 0 :
        # 首先判断最低位是否是1
        if num & 1 == 1:
            count += 1
        # 右移操作,看看其他位的情况
        num = num >> 1
    return count == 3

cou = 0
t = 1
while True:
    if cal1(t):
        cou+=1
    if cou == 23:
        print(t)
        break
    t+=1

美丽的2024

美丽的2024

在这里插入图片描述

思路分析:直接照搬上一题的cal1函数

# 直接暴力求解
# 位运算要学会移位运算
# 统计num二进制里面的1的个数
def cal1(num):
    count = 0
    while num > 0 :
        # 首先判断最低位是否是1
        if num & 1 == 1:
            count += 1
        # 右移操作,看看其他位的情况
        num = num >> 1
    return count

print(cal1(2024))
# 7

http://www.kler.cn/a/569125.html

相关文章:

  • Electron + Vite + React + TypeScript 跨平台开发实践指南
  • AWS ALB 实现灰度验证指南:灵活流量分配与渐进式发布
  • 题解 | 牛客周赛82 Java ABCDEF
  • 【51单片机】快速入门
  • 软件工程---基于构件的软件工程
  • 攻防世界WEB(新手模式)18-easyphp
  • node项目前后端密码加密传输及存储方案
  • 【终篇】基于C++的通讯录管理系统(完整源码)
  • 7-1JVMCG垃圾回收
  • 【西瓜书《机器学习》前三章内容通俗理解】
  • Golang语言特性
  • 【零基础C语言】第四节 数组
  • 网页制作09-html,css,javascript初认识のhtml如何使用表单
  • STM32 微控制器库RCC_ClkInitTypeDef结构参数介绍
  • (十一)基于vue3+mapbox-GL实现模拟高德实时导航轨迹播放
  • C# 类库打包dll文件
  • 数据库原理与使用基础教程
  • 安全测试之五:SQL Server注入漏洞几个实例
  • Linux学习笔记1
  • 差分矩阵问题