[特殊字符] 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字

news2025/3/29 12:29:22

🔍 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字

🚀 题目速览

题目难度:⭐⭐⭐(需掌握位运算与组合数学)

考察重点:二进制状态处理、位运算、乘法原理、枚举

P10984 [蓝桥杯 2023 国 Python A] 残缺的数字

题目描述

七段码显示器是一种常见的显示数字的电子元件,它有七个发光管组成:

上图依次展示了数字 0 ∼ 9 0\sim 9 09 用七段码来显示的状态,其中灯管为黄色表示点亮,灰色表示熄灭。根据灯管的亮暗状态,我们可以用一个状态码(状态码是一个 7 7 7 位的二进制数字)来表示一个七段码,令灯管点亮时状态为 1 1 1,灯管熄灭时状态为 0 0 0,按照灯管 A B C D E F G \rm ABCDEFG ABCDEFG 的顺序标识一个七段码,则数字 0 ∼ 9 0 \sim 9 09 的状态码为:

数字状态码数字状态码
0 0 0 1111110 1111110 1111110 5 5 5 1011011 1011011 1011011
1 1 1 0110000 0110000 0110000 6 6 6 1011111 1011111 1011111
2 2 2 1101101 1101101 1101101 7 7 7 1110000 1110000 1110000
3 3 3 1111001 1111001 1111001 8 8 8 1111111 1111111 1111111
4 4 4 0110011 0110011 0110011 9 9 9 1111011 1111011 1111011

小蓝有一个喜爱的数字,长度为 18 18 18 位,每一位用一个七段码显示器来展示
(每位只能是 0 ∼ 9 0 \sim 9 09,可以包含前导零),由于灯管故障,一些本该点亮的灯管
处于了熄灭状态。例如,对于一个长度为 2 2 2 的数字来说,当两个七段码对应的
状态码分别为: 1011111 1011111 1011111(高位)、 1110011 1110011 1110011(低位)时,原本的数字可能会是:
68 68 68 69 69 69 88 88 88 89 89 89,有 4 种可能的值。

18 18 18 个七段码显示器对应的状态码分别为:

0000011 0000011 0000011 1001011 1001011 1001011 0000001 0000001 0000001 0100001 0100001 0100001 0101011 0101011 0101011 0110110 0110110 0110110
1111111 1111111 1111111 0010110 0010110 0010110
0101001 0101001 0101001 0010110 0010110 0010110
1011100 1011100 1011100 0100110 0100110 0100110
1010000 1010000 1010000 0010011 0010011 0010011
0001111 0001111 0001111 0101101 0101101 0101101
0110101 0110101 0110101 1101010 1101010 1101010

其中每个表示一个七段码对应的的状态码(按照数字的高位到低位给出)。请你
判断下小蓝喜爱的数字有多少种可能的值。

输入格式

输出格式

一行一个整数表示答案。

(题目意思就是说18个七段码有多少种有效组合,

有效的例子:

  1. 二进制解析
    • 对应七段码的灯管状态为:GFEDCBA = 0000011
    • 即只有 G段F段 亮起 !
  2. 寻找有效数字
    • 检查数字0-9的原始亮灯状态是否包含G和F段亮起
    • 数字1的原始状态码:0110000(GFEDCBA)
      • G=0,F=0 → 不满足
    • 数字7的原始状态码:1110000
      • G=1,F=1 → 满足
    • 结论:该状态码对应有效数字可能为7

然后把这些可能在这18位数中进行组合)

🔥 核心解法:位运算 + 组合乘法

🛠️ 实现思路

  1. 二进制状态编码
    • 将每个七段码状态转换为整数(二进制处理)
    • 预计算数字0-9的标准七段码二进制值
  2. 状态匹配检测
    • 对每个输入状态码,检查其是否为某数字标准码的子集
    • 统计每个位置的有效数字数量
  3. 组合乘法
    • 所有位置的有效数字数量相乘得到最终结果

🛠️ C++代码实现

#include <iostream>
#include <vector>
#include <string>

using namespace std;

// 将7位二进制字符串转换为整数
int str_to_bits(const string& s) {
    int res = 0;
    for (char c : s) {          // 遍历每个字符
        res = (res << 1) |      // 左移腾出新位
              (c - '0');        // 转换字符为0/1
    }
    return res;
}

int main() {
    // 数字0-9的标准七段码(字符串形式)
    const vector<string> digit_codes = {
        "1111110", "0110000", "1101101", "1111001",
        "0110011", "1011011", "1011111", "1110000",
        "1111111", "1111011"
    };
    
    // 预计算数字对应的二进制值
    int digit_values[10];
    for (int i = 0; i < 10; ++i) {
        digit_values[i] = str_to_bits(digit_codes[i]);
    }

    // 题目给定的18个状态码
    const vector<string> input_codes = {
        "0000011", "1001011", "0000001", "0100001",
        "0101011", "0110110", "1111111", "0010110",
        "0101001", "0010110", "1011100", "0100110",
        "1010000", "0010011", "0001111", "0101101",
        "0110101", "1101010"
    };

    // 转换输入状态码为整型
    vector<int> states;
    for (const auto& code : input_codes) {
        states.push_back(str_to_bits(code));
    }

    // 计算总可能性
    long long total = 1;
    for (int state : states) {
        int valid_count = 0;
        for (int i = 0; i < 10; ++i) {  // 遍历所有数字
            // 关键判断:输入状态是数字状态的子集
            if ((digit_values[i] & state) == state) {
                ++valid_count;
            }
        }
        total *= valid_count;
    }

    cout << total << endl;  // 输出最终结果
    return 0;
}

📚 关键知识点解析

一、二进制状态处理

操作代码实现作用
字符串转二进制`(res << 1)(c - ‘0’)`
状态匹配检测(digit & input) == input验证输入状态是数字状态的子集

二、按位或运算符 |

作用:将两个数的二进制对应位进行逻辑或运算(任意一位为1则结果为1)

示例

Cppint a = 5;      // 00000101
int b = 3;      // 00000011
int c = a | b;  // 00000111(十进制7)

代码中的作用

  • res = ... | (c - '0') 将新位(0或1)拼接到结果末尾
  • 相当于二进制位的动态拼接

三、字符转换 c - '0'

作用:将字符 '0''1' 转换为整数 0 或 1

原理

  • 字符 '0' 的ASCII码是48,'1' 是49
  • '0' - '0' = 0'1' - '0' = 1

🚨 易错点警示

错误1:位运算优先级错误

// 错误写法:缺少括号导致逻辑错误
if (digit & state == state) 

// 正确写法
if ((digit & state) == state)

错误2:二进制转换错误

// 错误:逆序处理导致位顺序错误
for (int i = s.size()-1; i >=0; --i)  // 错误处理顺序

// 正确:按字符串顺序处理
for (char c : s)  // 从左到右处理

⚡ 性能分析

操作时间复杂度空间复杂度说明
预处理数字状态O(10)O(1)固定10个数字
处理输入状态O(18)O(18)固定18个状态码
计算有效数O(18×10)O(1)常数级运算
总复杂度O(1)O(1)所有操作均为常数时间

🌟 举一反三

变种题1:动态七段码显示

若七段码显示模式可变(如部分段损坏不可用),需修改状态检测逻辑:

// 添加损坏段掩码
int broken_mask = 0b0010000;  // 假设G段损坏
if ((digit & (state | broken_mask)) == state) {
    // 有效条件需排除损坏段
}

变种题2:多状态可能性查询

若需多次查询不同状态组合,可预先建立数字状态的特征矩阵:

vector<bitset<128>> feature(10);  // 每个数字的状态特征
// 预处理所有可能状态
for (int i=0; i<10; ++i) {
    for (int s=0; s<128; ++s) {
        feature[i][s] = ((digit_values[i] & s) == s);
    }
}

答案验证:运行程序输出 254016000,与Python实现结果一致,验证算法正确性。本解法通过位运算优化,在保证可读性的同时达到最优性能,适合蓝桥杯竞赛场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程控制与线程库

目录 解析tid 线程的地址空间布局 线程栈 我们来学习线程控制与线程库 解析tid #include<iostream> #include<string> #include<cstdio> #include<cstring> #include<unistd.h> #include<thread> using namespace std;int shared_val…

P1182 数列分段 Section II

P1182 数列分段 Section II - 洛谷 题目描述 对于给定的一个长度为 N 的正整数数列 A1​∼AN​&#xff0c;现要将其分成 M&#xff08;M≤N&#xff09;段&#xff0c;并要求每段连续&#xff0c;且每段和的最大值最小。 关于最大值最小&#xff1a; 例如一数列 4 2 4 5 1…

比手动备份快 Iperius全自动加密备份,NAS/云盘/磁带机全兼容

IperiusBackupFull是一款专为服务器和工作站设计的备份解决方案&#xff0c;它同时也是一款针对Windows 7/8/10/11/Server系统的简洁且可靠的备份软件。该软件支持增量备份、数据同步以及驱动器镜像&#xff0c;确保能够实现完全的系统恢复。在备份存储方面&#xff0c;Iperius…

2025最新版Ubuntu Server版本Ubuntu 24.04.2 LTS下载与安装-详细教程,细致到每一步都有说明

官网 https://ubuntu.com/ 下载 点击菜单 Prodercts> Ubuntu OS>Ubuntu Server 点击下载 下载后会有个弹窗 安装 选择第一个 install Ubuntu Server 直接默认&#xff0c;选择English 【默认】 选择键盘布局【默认】 选择安装配置【默认】 配置网络 我这里选择…

更新测试环境构建命令以解决构建失败问题

本段代码解决 更新测试环境构建命令以解决构建失败问题 //本项目是reactumi3antdesign 搭建的后台管理系统 "build:test": "cross-env UMI_ENVtest NODE_OPTIONS--openssl-legacy-provider umi build"**原因&#xff1a;**Node.js v17 的 OpenSSL 3.0 与旧…

树莓派5-GPIO和40针引脚

1.树莓派5引脚图 2.GPIO 引脚作用 (1) 电压 板上有两个 5V 引脚和两个 3.3V 引脚&#xff0c;以及一些不可配置的接地引脚 (0V)。其余引脚均为通用 3.3V 引 脚&#xff0c;这意味着输出设置为 3.3V&#xff0c;输入可接 3.3V。 (2) 输出 指定为输出引脚的 GPIO 引脚可设置为…

【数据库】sql错题详解

1. 执行子查询 SELECT 供应商号 FROM 订购单 WHERE 职工号 IN (E1, E3) GROUP BY 供应商号 HAVING COUNT(DISTINCT 职工号) 2筛选职工号为 E1 或 E3 的记录&#xff1a; 依据 WHERE 职工号 IN (E1, E3) 这个条件&#xff0c;从 订购单 表中把职工号为 E1 或者 E3 的记录筛选出…

C#重写treeView控件

1.先准备两张图片downdrop.png、downdrop_open.png放在项目Resources里 2.新建用户控件BaseTreeView控件 3.重写控件继承TreeView&#xff0c;记得删除AutoScaleMode这一行&#xff0c;否则会报错 public partial class BaseTreeView : TreeView {//这个属性貌似不起作用&…

ArcGIS 10.8.1之后发布栅格数据的MapServer 动态工作空间 替换数据源渲染问题

背景 经过测试&#xff0c;Server 10.8.1、11.0、11.1发布相关服务设置动态空间之后&#xff0c;前端都无法自动读取同名的clr色彩映射表文件进行渲染&#xff0c;服务都是由ArcGIS Pro进行发布。 原因 基于ArcMap发布的服务才支持&#xff0c;但是10.8.1之后不支持ArcMap发…

Java集合框架深度剖析:从数据结构到实战应用

引言 Java集合框架是Java开发中的核心组件之一&#xff0c;其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景&#xff0c;集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发&#xff0c;深入剖析其主流实现类&#xff0…

涅槃上岸,入陕进军,复试全程流程开启!

复试决胜局&#xff0c;整装待发&#xff0c;上岸西电&#xff01; 线下复试注意事项、全流程、录取后西安旅游提前告知&#xff01; 过两天考研复试笔试、机试&#xff08;如果有&#xff09;、面试就要开始了&#xff0c;我们需要准备很多东西&#xff0c;学长从以下几个方面…

msyql--基本操作之运维篇

检查 root 用户的权限 查看该用户针对这个数据库的权限 -- 如果在终端连接mysql时需要 mysql -u root -p -- 查看用户权限 SELECT user, host FROM mysql.user WHERE user root;可以看的出来root有他的访问权限&#xff0c;如过没有localhost或者% 说明没有访问权限 添加…

es6 fetch

对比XHR &#x1f6e0;️ fetch 所有配置项 fetch(url, {// 核心配置 method: GET, // HTTP 方法: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONSheaders: { // 请求头&#xff08;支持 Headers 对象或普通对象&#xff09;Content-Type: applicati…

智能汽车图像及视频处理方案,支持视频星轨拍摄能力

美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案&#xff0c;一个集高效性、智能化、画质增强于一体的创新解决方案&#xff0c;旨在重塑智能汽车图像画质的新标准&#xff0c;并支持前…

C盘急救实录:从爆红到畅快

极速救援通道&#xff08;懒人专享&#xff09; 老规矩&#xff0c;先上王炸方案&#xff01;”小番茄C盘清理器”直达链接&#xff1a;https://cclean-cdn.xkbrowser.com/cleanmaster/FanQieClean_13046_st.exe 这个神器有三绝&#xff1a; 智能扫描引擎&#xff1a;能识别23…

UART转APB模块ModelSim仿真

一、简介 之前介绍过一个UART转AHB模块&#xff0c;这个代码的框架有个好处&#xff0c;就是FPGA内总线接口比较容易修改成其他总线接口。下图是UART转AHB模块中子模块uart_ahb_mst的框图&#xff0c;主要有三个状态机&#xff1a; &#xff08;1&#xff09; UART_RX_FSM将接收…

Cesium 自定义路径导航材质

cesium 自定义路径导航纹理图片随便更换&#xff0c;UI 提供设计图片即可达到效果&#xff1b; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码&#xff1b; 拿到就能用轻松解决&#xff01;帮忙点个关注吧&#xff01;

【江协科技STM32】BKP备寄存器RTC实时时钟(学习笔记)

BKP备寄存器 BKP简介 BKP&#xff08;Backup Registers&#xff09;备份寄存器BKP可用于存储用户应用程序数据。当VDD&#xff08;2.0~3.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT&#xff08;1.8~3.6V&#xff09;维持供电。当系统在待机模式下被唤醒&#xff0…

卷积神经网络 - 参数学习

本文我们通过两个简化的例子&#xff0c;展示如何从前向传播、损失计算&#xff0c;到反向传播推导梯度&#xff0c;再到参数更新&#xff0c;完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络&#xff0c;其结构仅包含一个卷积层和一个输出…

亮数据爬取API爬取亚马逊电商平台实战教程

前言 在当今数据驱动的商业环境中&#xff0c;企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而&#xff0c;传统的手动网页爬取方式面临着诸多挑战&#xff1a;IP封锁、验证码干扰、网站结构频繁变更&#xff0c;以及高昂的运维成本…