【CODEMATE】进制转换(transform) 粤港澳青少年信息学创新大赛 C/C++/Python 解题思路
目录
- 问题描述
- 做题思路,解决过程
- 思路:
- 踩过的坑:
- 核心代码
- C 语言 / C++ 切片:
- C 语言 / C++ 判断 ‘A’ 数量:
- Python 切片:
- Python 判断 ‘A’ 数量:
- 完整代码
- C 语言 完整代码
- C++ 完整代码
- Python 完整代码
- 评测结果
- C语言
- C++
- Python
- 后记
问题描述
知识点:字符串 位运算 难度值:3 尝试:15 AC:5 上传者:_Separation
题目背景:
码上学习工作室 CSP - J 月赛 A 题
十六进制是一种基数为 ‘16’ 的计数系统,使用数字 ‘0’ 到 ‘9’ 和字母 ‘A’ 到 ‘F’ 来表示数值。在这种系统中,逢 ‘16’ 进 ‘1’,‘A ~ F’ 代表 ‘10 ~ 15’ 。
问题描述:
给定一个正整数 n 和一个有 4n 位的二进制数(不保证没有前导零)
请你求出,该二进制数转化为十六进制表示后共有多少个 ‘A’ 。
输入输出格式:
Input
输入两行。
第一行输入一个正整数 n 。
第二行输入一个只由 ‘01’ 构成的 4n 位二进制数,不保证没有前导零。
Output
输出一行。
行输出一个整数,表示输入的二进制数用十六进制表示时 ‘A’ 的个数。
输入输出样例:
输入数据 1
3
101010111100
输出数据 1
1
【样例 ‘1’ 解释】:该二进制数用十六进制表示为 ‘ABC’ ,其中有一个 ‘A’ 。
输入数据 2
10
1111111111111110000000000000001110001101
输出数据 2
0
数据范围与提示:
对于前 20% 的数据,保证 n = 1
对于前 40% 的数据,保证 n ≤ 10
对于前 60% 的数据,保证 n ≤ 103
对于 100% 的数据,保证 1 ≤ n ≤ 106
做题思路,解决过程
通过读题可以得知:
题目至少需要 3 个变量,分别是:输入变量正整数 n 、长度为 4n 的字符串 str(只有01构成的的二进制字符串)、输出变量 num (str 转换成十六进制表示时 ‘A’ 的个数)。
思路:
第一步:先将二进制串 str 按间距为 4 切片(4 位二进制可以表示 1 位十六进制),如将输入数据 1 :101010111100,切成 1010 、 1011 、 1100。第二步:由题目得知需要求 ‘A’ 的个数,由于所求 ‘A’ 是个固定值(‘A’ 二进制为 1010 、十进制为 10 、十六进制为 ‘A’),所以直接判断 str 切片里是否有 ‘A’ 的二进制值即可。
踩过的坑:
一开始看到题目我想着先将二进制串 str 转换为十六进制串,再判断十六进制串里有多少个 ‘A’,如果用这种方法又涉及到不同进制间转换,python 里倒是有方法可以实现,但是放到 C/C++ 里就需要自己写方法函数,走弯路了。
后来反思为什么会出现这种思路,由于常规思考都是线性的,所以理所当然会按照解决问题的过程一步一步去构思代码(面向过程),在比赛面对算法题时,时间是有限的,输入输出也是有限的,我们只需要将输入输出对应起来即可,所以思考时需要更抽象、抓住问题本质(抽象、黑盒测试、面向对象)。
还有一点就是题目里说的:“第二行输入一个只由 ‘01’ 构成的 4n 位二进制数,不保证没有前导零。”,还好题目说的是“不保证没有前导零”,意思是会有前导零,使二进制串的长度为 4n。如果题目改成“没有前导零”,那就麻烦一点,需要先判断补多少个前导零,再切片。虽然题目有说输入字符串长度为 4n,但是咱们做题得会举一反三,多点想法是有利于自己的,注意做题思路别被想法带偏了。
核心代码
1. 将字符串按间距 4 切片
2. 对 ‘A’ 数量的判断:
C 语言 / C++ 切片:
利用循环,按 4 为增量做循环,直到遍历数组即可。
int n; //定义变量 nscanf("%d", &n); //获取 n 的值
//也可以写成:
//cin >> n; // C++ 的输入函数char str[n*4]; //定义二进制数组 strscanf("%s", str); //获取二进制数组值
//cin >> str;//切片
for(int i=0, j=0; i<n*4; i+=4, j++ )
{printf("第 %d 次切片:", j); //cout << "第 " << j << " 次切片";printf("%c", str[i]);printf("%c", str[i+1]);printf("%c", str[i+2]);printf("%c\n", str[i+3]);
}
C语言 / C++ 切片运行结果
C 语言 / C++ 判断 ‘A’ 数量:
稍加修改切片循环的代码,将打印切片的代码换成判断代码即可。
判断 ‘A’ 的方法有很多种,作者提供两种思路:
1.按 4 位二进制分成一组,判断是否为 ‘1010’。
2.将四位二进制分成一组,判断其十进制值是否为 10。
//在切片循环代码的基础上修改
// 方法 1
int num_A=0;
for(int i=0; i<n*4; i+=4)
{if(str[i]!='1')continue; //如果不符合 'A' 的二进制,则直接寻址下 4 位,节省时间else if(str[i+1]!='0')continue;else if(str[i+2]!='1')continue;else if(str[i+3]!='0')continue;elsenum_A++;/**也可以将循环内代码写成:if(s[i]=='1' && s[i+1]=='0' && s[i+2]=='1' && s[i+3]=='0')num_A++;*/
}printf("%d", num_A);// 方法 2
/**
int num_A=0;// 将字符 ‘1’ 或 ‘0’ 转换成整数 1 或 0
for(i=0;i<n*4;i++)
{str[i]-='0';
}// 4 位二进制为一组,转换成十进制数
for(i=0; i<n*4-3; i+=4)
{ num=bin[i]*8 + bin[i+1]*4 + bin[i+2]*2 + bin[i+3];if(num==10){num_A+=1;}
}printf("%d", num_A);
*/
C 语言 / C++ 判断 ‘A’ 数量运行结果
Python 切片:
Python 的切片语句是:序列[start:stop:step]
,序列可以是字符串、列表、元组等; start:stop
表示切片起点和终点; step
表示步长,由于切片都是在元素的左边切一刀,这就导致切片 1 序列[0:4]
实际值是 序列[0:3]
,轮到下一个切片 2 序列[4:8]
, 切片 1 的结束下标 3
与切片 2 的起点下标的差值就是 step
。
n=int(input())
str=input()# 利用循环语句切片
for i in range(0, len(str), 4): print(str[i:i+4])
Python 切片运行结果
Python 判断 ‘A’ 数量:
判断代码也是在切片的基础上稍加修改,加入变量 num_A
记录 ‘A’ 的个数。由于 Python 里没有自增自减的运算,所以用 +=
代替 ++
。
n=int(input())
str=input()
num_A=0;# 利用循环语句切片
for i in range(0, len(str), 4): if(str[i:i+4]=="1010")num_A+=1;print(num_A)
Python 判断 ‘A’ 数量运行结果:
完整代码
C 语言 完整代码
#include <stdio.h>int main()
{int n, num_A=0; //定义变量 n 、变量 num_Ascanf("%d", &n); //获取 n 的值char str[n*4]; //定义二进制数组 strscanf("%s", str); //获取二进制数组值//判断 ‘A’ 数量for(int i=0; i<n*4; i+=4){if(str[i]!='1')continue; //如果不符合 'A' 的二进制,则直接寻址下 4 位,节省时间else if(str[i+1]!='0')continue;else if(str[i+2]!='1')continue;else if(str[i+3]!='0')continue;elsenum_A++;}printf("%d", num_A);
}
C++ 完整代码
#include <iostream>using namespace std;int main()
{int n, num_A=0; //定义变量 n 、变量 num_Acin >> n; //获取 n 的值char str[n*4]; //定义二进制数组 strcin >> str; //获取二进制数组值//判断 ‘A’ 数量for(int i=0; i<n*4; i+=4){if(str[i]!='1')continue; //如果不符合 'A' 的二进制,则直接寻址下 4 位,节省时间else if(str[i+1]!='0')continue;else if(str[i+2]!='1')continue;else if(str[i+3]!='0')continue;elsenum_A++;}cout << num_A;
}
Python 完整代码
n=int(input())
str=input()
num_A=0# 利用循环语句切片
for i in range(0, len(str), 4): # 从这里可以看出 n 的数值不影响 str 的输入if(str[i:i+4]=="1010"):num_A+=1# 输出 "A" 的个数
print(num_A)
评测结果
C语言
C++
Python
后记
通过评测结果可以看出 Python 的代码虽然短,但在耗时、内存占用上远远比不上 C/C++,这也是为什么尽管各大语言兴起,也无法撼动 C/C++ 基石,经典经久不衰是有其道理的。
这篇文章花了很长时间打磨,从读题、解题再到优化,回顾这一过程也可以说是自己进步的过程,不积硅步无以至千里,不积小流无以成江海,冲!
相关文章:

【CODEMATE】进制转换(transform) 粤港澳青少年信息学创新大赛 C/C++/Python 解题思路
目录 问题描述做题思路,解决过程思路:踩过的坑:核心代码C 语言 / C 切片:C 语言 / C 判断 ‘A’ 数量:Python 切片:Python 判断 ‘A’ 数量: 完整代码C 语言 完整代码C 完整代码Python 完整代码…...
统计文件中单词出现的次数并累计
# 统计单词出现次数 fileopen("E:\Dasktape/python_test.txt","r",encoding"UTF-8") f1file.read() # 读取文件 countf1.count("is") # 统计文件中is 单词出现的次数 print(f"此文件中单词is出现了{count}次")# 2.判断单词出…...
DbCreateHelper数据库创建指南
DbCreateHelper 是一个用于简化数据库创建和初始化过程的工具类,它封装了常见的数据库操作,使开发者能够更便捷地创建、配置和管理数据库。 1.主要功能 数据库创建与初始化 表结构创建与管理 数据库版本控制 数据迁移支持 数据库连接管理 基本用法…...

2025 Java 开发避坑指南:如何避免踩依赖管理的坑?
在 Java 开发的世界里,依赖管理就像是一座看不见的桥梁,连接着项目所需的各种第三方库和框架。然而,这座桥梁并非总是稳固,稍有不慎就可能掉入 “依赖地狱”,导致项目编译失败、运行异常。2025 年,随着开源…...

ARM服务器与X86服务器核心区别分析
ARM服务器与X86服务器核心区别分析 一、架构设计与指令集差异 指令集本质 ARM:基于RISC(精简指令集),指令定长且简单,单周期执行效率高,硬件设计复杂度低,适合低功耗场景。 X86…...

人口老龄化丨AI健康小屋如何实现防病于未然
随着全球老龄化加剧,“银发浪潮” 对医疗资源、养老护理和健康管理提出了严峻挑战。 由此智绅科技应运而生,七彩喜智慧养老系统构筑居家养老安全网。 AI 健康小屋作为银发科技的创新载体,通过智能化健康监测、精准化风险预警、便捷化医疗衔…...

记录搭建自己应用中心
记录搭建自己应用中心 应用架构主应用-管理中心系统文件系统子应用 日志系统日志系统前端日志系统后端 用户系统接入使用暂未完成 研发管理需求面板消息推送任务分配应用发布 应用架构 一直想做个试试,这是一个简易版的,主要是整合下知识的,…...

git版本回退 | 远程仓库的回退 (附实战Demo)
目录 前言1. 基本知识2. Demo3. 彩蛋 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 本身暂存区有多个文件,但手快了&…...

STM32 的 GPIO和中断
GPIO的简单介绍 内部结构 施密特触发器(TTL肖特基触发器) 的工作原理: 施密特触发电路(简称)是一种波形整形电路,当任何波形的信号进入电路时,输出在正、负饱和之间跳动,产生方波或…...
【Python数据库编程实战】从SQL到ORM的完整指南
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:SQLite基础操作案例2:MySQL连接池案例3:SQLAlchemy ORM …...

【因果推断】(二)CV中的应用
文章目录 因果表征学习因果图 (Causal Diagram)“后门准则”(backdoor criterion)和“前门准则”(frontdoor criterion)后门调整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…...

分享Matlab成功安装Support Package硬件支持包的方法
分享Matlab成功安装Support Package硬件支持包的方法 文章目录 分享Matlab成功安装Support Package硬件支持包的方法一、 引言二、 操作步骤三、 附件资料四、总结 一、 引言 最近,我想学习基于Matlab simscape & Arduino实现硬件在环仿真,其中物理…...

电子级甲基氯硅烷
电子级甲基氯硅烷是一类高纯度有机硅化合物,主要用于半导体制造、光伏产业及高端电子材料领域。以下从技术特性、应用场景、生产工艺、市场动态及安全规范等方面展开分析: 一、核心特性与技术标准 高纯度要求 电子级甲基氯硅烷的纯度通常需达到99.99% 以…...
C语言面试高频题——define 和typedef 的区别?
1. 基本概念 (1) #define 定义:#define 是预处理指令,用于定义宏。作用:在编译之前进行文本替换。语法:#define 宏名 替换内容示例:#define PI 3.14159 #define SQUARE(x) ((x) * (x))(2) typedef 定义:…...
[FPGA基础] 原语简介篇
Xilinx FPGA 原语介绍指南 1. 引言 在 Xilinx FPGA 设计中,原语 (Primitives) 是 FPGA 硬件资源的最基本构建块,直接映射到 FPGA 的底层硬件结构。原语允许设计者以低级别方式控制硬件行为,优化性能、功耗和资源利用率。本文档基于 Xilinx …...

【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度
目录 引言 一、性能优化:突破数据处理极限,提升运行效率 1.1 智能查询优化器:精准优化数据检索路径 1.2 并行处理技术:充分释放多核计算潜力 1.3 智能缓存机制:加速数据访问速度 二、稳定性提升:筑牢…...

热度大幅度下降,25西电经济与管理学院(考研录取情况)
1、经济与管理学院各个方向 2、经济与管理学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、应用经济及学25年相较于24年下降25分,为325分 2、管理科学与工程25年相较于24年保持不变,为375分 3、工商管理学25年相较于24年下降5分…...
安卓四大组件之ContentProvider
目录 实现步骤 代码分析 onCreate insert query ContextHolder Cursor 作用与用法 基本步骤: 可能的面试题:为什么使用Cursor? 为什么使用Cursor 使用Cursor的好处 静态内部类实现单例模式 AnndroidManifest.xml配置信息 注释的…...

DeepSeek+Mermaid:轻松实现可视化图表自动化生成(附实战演练)
目录 一、引言:AI 与图表的梦幻联动二、DeepSeek:大语言模型新星崛起2.1 DeepSeek 全面剖析2.2 多场景应用示例2.2.1 文本生成2.2.2 代码编写 三、Mermaid:代码式图表绘制专家3.1 Mermaid 基础探秘3.2 语法与图表类型详解3.2.1 流程图&#x…...
redis客户端库redis++在嵌入式Linux下的交叉编译及使用
在开发过程中,我们经常会遇到需要在嵌入式Linux系统上与Redis进行交互的需求。因此选择一个适合的Redis客户端库就显得尤为重要。下面介绍下c中有名的redis-plus-plus(redis)三方库在嵌入式linux下的交叉编译及使用。该库底层是基于hiredis的…...
gitlab-ce容器镜像源(国内)
下载命令 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0 更多参考: https://docker.aityp.com/image/docker.io/gitlab/gitlab-ce:17.10.4-ce.0...
小白自学python第二天
学习python的第二天 一、判断语句 1、布尔类型和比较运算符 1、布尔类型 表示现实生活中的逻辑,真(True,用数字1表示)和假(False,用数字0表示) 2、布尔类型变量的定义 变量的名称 布尔类…...
嵌入式面试高频考点深度解析:内存管理、指针操作与结构体实战指南
试题一:大小端系统中数据的内存表现形式 题目 short tmp 0xaabb; 请分别写出大小端系统中,tmp 在内存中的表现形式。 分析 1. 什么是高位与低位? 对于一个数据而言,以十六进制数 0xaabb 为例,从左至右࿰…...
ApplicationRunner的run方法与@PostConstruct注解
ApplicationRunner 的 run 方法与 PostConstruct 注解在 Spring Boot 中均用于初始化逻辑,但二者的 执行时机、作用范围 和 功能特性 存在显著差异。以下是详细对比分析: 一、核心差异对比 维度PostConstructApplicationRunner.run()触发时机Bean 实例化…...

今日行情明日机会——20250425
指数依然在震荡,等待方向选择,整体量能不搞但个股红多绿少。 2025年4月25日涨停板行业方向分析如下: 一、核心行业方向及驱动逻辑 一季报增长(17家涨停) 核心个股:惠而浦、鸿博股份、卫星化学驱动逻辑&am…...

一道MySQL索引题
复合索引基础 MySQL中的复合索引(Composite Index)是指由多个列组成的索引。与单列索引不同、复合索引的结构更为复杂,但使用得当可以大幅提升查询性能。 复合索引的工作原理 复合索引的本质是一种有序的数据结、每个列是建立在那个索引前一列存在的情况下、那一…...
Python 读取 txt 文件详解 with ... open()
文章目录 1 概述1.1 注意事项1.2 模式说明1.3 文件准备 2 读文件2.1 读取整个文件2.2 逐行读取2.3 读取所有行到列表 3 写文件3.1 覆盖写入3.2 追加写入3.3 写入多行 4 实用技巧4.1 检查文件是否存在4.2 异常处理 1 概述 1.1 注意事项 文件编码:建议指定编码&…...

【linux】设置邮件发送告警功能
当服务器内存不足或者其他故障时,可以通过自动发送故障到邮箱进行提醒。 步骤: 以qq邮箱为例: 登录qq邮箱点击设置 点击账号后,往下翻 找到POP3/IMAP...开启服务 复制授权码 安装邮箱功能 编辑/etc/s-nail.rc 验证 …...

【手机】vivo手机应用声音分离方案
文章目录 前言方案 前言 尝试分离vivo手机音乐与其他应用的声音 方案 最佳方案:网易云音乐设置内关闭音量均衡 上传不同的白噪音,成功 goodlock,主要适用于三星手机,vivo不一定适用 app volume control ,可行...

关于Safari浏览器在ios<16.3版本不支持正则表达式零宽断言的解决办法
异常原因 今天在升级Dify版本的时候发现低版本的ios手机出现了以下报错: SyntaxError: Invalid regular expression: invalid group specifier nameError: Invalid regular expression: invalid group specifier name Call Stack 46 eval [native code] (0:0) ./n…...