蓝桥杯pythonB组

1.好数

问题描述

一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。

给定一个正整数 NN,请计算从 1 到 NN 一共有多少个好数。

样例输入

24

样例输出

7

样例说明

24 以内的好数有 1、3、5、7、9、21、23,一共 7个。

运行代码

n = int(input())
res = 0
for i in range(1, n + 1):
    d = 1
    while i > 0:
        if i % 2 != d: #求余可得到个位数
            break
        i //= 10 #依次整除10可以依次得到十位、百位、千位...
        d ^= 1  #^异或
    res += i == 0  #作用是,如果 i == 0 为 True,则将 res 加 1。否则,res 不变  
print(res)

代码解释

1.首先,我们接受一个正整数N作为输入。

2.初始化变量res为0,用于记录”好数"的个数。

3.使用for循环遍历从1到N的所有整数,并依次赋给i。

4.for循环中,初始化一个变量d=1,以此来表示奇数位

4.对于每个整数i,我们使用一个while循环来检查这个i是否为“好数”。

5.在for循环与while循环之间,我们初始化一个变量d=1,以此来表示奇数位(奇数%2==1)。

6.每次循环中,我们首先检查当前位置的数字是否和d相符(即奇数位是奇数,偶数位是偶数),如果不符合,则 break 退出循环,表示这个数字不是"好数"。

7.然后,我们将 i 整除 10,移到下一位数字。同时,我们用 d 异或 1 来切换到下一个位置(奇数位变偶数位,偶数位变奇数位)

8. n+=i==0原理:当i==0时说明已经到了最高位,能到达最高位说明i满足“好数”的要求。

补充:

d ^= 1 是一个很巧妙的操作,它用来交替处理奇数位和偶数位。

在这个代码中,d 是一个标志位,用来表示当前处理的是奇数位还是偶数位。

  • 当 d 为 1 时,表示当前处理的是奇数位。

  • 当 d 为 0 时,表示当前处理的是偶数位。

在每次循环中,我们先检查当前位置的数字是否满足条件,然后移到下一个位置。同时,我们需要切换到下一个位置的标志位。这时候,就可以使用 d ^= 1 这个操作来实现切换。

### 蓝桥杯 Python B 比赛资料与解题技巧 #### 关于蓝桥杯 Python B 的比赛题目 对于想要了解历年的蓝桥杯 Python B 比赛题目,可以参考官方发布的往届试题以及解析文档。这些资源不仅提供了具体的编程挑战案例,还附带详细的解答过程和评分标准[^1]。 #### 解题思路分析 针对不同类型的算法问题,建议采用分而治之的方法来构建解决方案框架。例如,在处理字符串操作时,可以通过正则表达式简化模式匹配;面对数据结构相关的难题,则应熟练掌握栈、队列等基本概念及其应用场景。此外,动态规划也是常见的考点之一,理解状态转移方程的设计至关重要[^2]。 #### 备战策略分享 为了更好地迎接这一赛事,考生应当制定合理的学习计划并严格执行。除了日常练习外,观看高质量的教学视频能够帮助巩固理论知识的同时提升实战能力。特别是那些专注于特定主题如图论、数论等领域深入探讨的内容更值得借鉴学习[^3]。 #### 实际参赛注意事项 当正式参与竞赛时,务必提前熟悉考试环境及相关规定。如果遇到权限访问方面的问题(比如无法查看指定年份的真题),应及时向所在学校的指导教师寻求协助以获取必要的授权支持[^4]。 ```python def example_solution(problem_input): """ 这是一个示例函数用于展示如何编写清晰易懂且高效的代码。 参数: problem_input (list): 输入的数据集合 返回值: result (int/float/string/list...): 计算得到的结果形式依具体题目要求而定 """ # 假设这里实现了某种有效的求解逻辑... pass if __name__ == "__main__": test_case = [...] # 替换为实际测试用例 output = example_solution(test_case) print(f"The solution is {output}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值