好数(蓝桥杯)

博客围绕蓝桥杯题目,探讨从1到N中“好数”的数量计算。“好数”要求奇数位数字为奇数,偶数位数字为偶数。给出两种暴力计算方法,一是从个位开始取数判断,二是分位数奇偶情况讨论,还给出代码判断数是否为好数。

好数

题目描述

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

给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。
【输入格式】
一个整数 N。
【输出格式】
一个整数代表答案。
【样例输入 1】

24

【样例输出 1】

7

【样例输入 2】

2024

【样例输出 2】

150

【样例说明】
对于第一个样例,24 以内的好数有 1、3、5、7、9、21、23,一共 7 个。

【评测用例规模与约定】
对于 10% 的评测用例,1 ≤ N ≤ 100。
对于 100% 的评测用例,1 ≤ N ≤ 107

暴力方法一

从题目中可以得出结论:奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数

那么就可以定义一个k代表数字n的当前位数,从1开始计数,即个位是1,十位是2,百位是3……

然后就可以从个位开始取数,判断该数是否为好数,每取走一位,k加上1,进入下一位

// 包含C++程序中常用的库,是C++标准库的一个集合,包括了I/O、字符串和容器等
#include<bits/stdc++.h>
// 使用std命名空间中的名字,避免每次调用标准库中的东西都要加上std::前缀
using namespace std;

// 定义一个函数check,用于检查某个整数n是否是“好数”
bool check(int n)
{
   
   
    int k=1; // 代表数字n的当前位数,从1开始计数,即个位是1,十位是2,百位是3,以此类推

    // 循环检查整数n的每一位
    while(n)
    {
   
   
        int t=n%10; // t为n的当前最低位的数字,%运算符取余数

        // 检查当前位数k是否与对应的数字t符合好数的定义
        if(k%2==1 && t%2==0) // 如果位数k是奇数但数字t是偶数,则不满足好数的定义
            return false; // 返回false,表示n不是好数
        if(k%2==0 
### 蓝桥杯 Python 练习题及解析 #### 题目背景 蓝桥杯大赛作为一项面向全国高校学生的编程竞赛活动,提供了丰富的练习资源。以下是基于历年真题整理的 Python 相关题目及其解析。 --- #### 1. 带宽问题 ##### **题目描述** 给定一组网络节点之间的连接关系以及每条边的最大传输速率(即带宽),求从源节点到目标节点的最大流量。 ##### **思路分析** 该问题是经典的图论最大流问题,可以采用 Ford-Fulkerson 或 Edmonds-Karp 算法解决。通过构建邻接矩阵表示图并不断寻找增广路径来更新残余容量,直到无法找到新的增广路径为止[^1]。 ##### **代码实现** ```python from collections import defaultdict, deque def bfs(graph, source, target, parent): visited = set() queue = deque([source]) while queue: u = queue.popleft() for idx, val in enumerate(graph[u]): if idx not in visited and val > 0: queue.append(idx) visited.add(idx) parent[idx] = u if idx == target: return True return False def ford_fulkerson(graph, source, target): parent = [-1] * (len(graph)) max_flow = 0 while bfs(graph, source, target, parent): path_flow = float('Inf') s = target while s != source: path_flow = min(path_flow, graph[parent[s]][s]) s = parent[s] max_flow += path_flow v = target while v != source: u = parent[v] graph[u][v] -= path_flow graph[v][u] += path_flow v = parent[v] return max_flow ``` --- #### 2. 纯质 ##### **题目描述** 定义纯质一个整数本身是质且其各位数字之和也是质。输入一个范围 `[a, b]`,找出其中所有的纯质。 ##### **思路分析** 先利用埃拉托色尼筛法预处理一定范围内的所有质集合,再逐一遍历区间中的每个判断是否满足条件。对于每一位数字相加的结果也需要验证是否属于质集[^2]。 ##### **代码实现** ```python import math def sieve_of_eratosthenes(limit): is_prime = [True] * (limit + 1) p = 2 while p * p <= limit: if is_prime[p]: for i in range(p * p, limit + 1, p): is_prime[i] = False p += 1 primes = [] for p in range(2, limit + 1): if is_prime[p]: primes.append(p) return set(primes) def pure_primes(a, b): prime_set = sieve_of_eratosthenes(b) result = [] for num in range(max(2, a), b + 1): if num in prime_set: digit_sum = sum(int(digit) for digit in str(num)) if digit_sum in prime_set: result.append(num) return result ``` --- #### 3. 完全日期 ##### **题目描述** 给出两个日期字符串 `start_date` 和 `end_date`,计算两者之间完整的天差值。 ##### **思路分析** 使用 Python 的标准库模块 `datetime` 来解析日期,并调用 `.date()` 方法获取具体日期对象后做减法运算即可得到时间间隔。注意闰年的特殊处理逻辑已内置支持。 ##### **代码实现** ```python from datetime import datetime def days_between_dates(start_date_str, end_date_str): start_date = datetime.strptime(start_date_str, "%Y-%m-%d").date() end_date = datetime.strptime(end_date_str, "%Y-%m-%d").date() delta = abs((end_date - start_date).days) return delta ``` --- #### 4. 最小权值 ##### **题目描述** 在一个无向连通图中选取若干条边使得任意两点间均存在至少一条路径相连,同时所选边总权重尽可能小。 ##### **思路分析** 此乃典型的最小生成树问题,可选用 Kruskal 或 Prim 算法完成任务。Kruskal 更适合稀疏图场景下操作效率更高;Prim 则适用于稠密图环境更优。 ##### **代码实现** ```python class UnionFind: def __init__(self, n): self.parent = list(range(n)) def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) # Path compression return self.parent[x] def union(self, x, y): rootX = self.find(x) rootY = self.find(y) if rootX != rootY: self.parent[rootY] = rootX def kruskal(edges, nodes_count): edges.sort(key=lambda edge: edge[2]) # Sort by weight uf = UnionFind(nodes_count) mst_weight = 0 selected_edges = [] for u, v, w in edges: if uf.find(u) != uf.find(v): # No cycle formed uf.union(u, v) mst_weight += w selected_edges.append((u, v, w)) return mst_weight, selected_edges ``` --- #### 5. 大写转换 ##### **题目描述** 将一段英文文本中的单词首字母全部改为大写字母形式输出。 ##### **思路分析** 借助字符串方法 `.capitalize()` 对单个词进行大小写调整,或者整体应用 `.title()` 函快速达成目的。 ##### **代码实现** ```python def capitalize_words(sentence): words = sentence.split() capitalized_words = [word.capitalize() for word in words] return ' '.join(capitalized_words) ``` --- ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运从未公平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值