【CODEMATE】进制转换(transform) 粤港澳青少年信息学创新大赛 C/C++/Python 解题思路

news2025/4/26 5:22:14

目录

  • 问题描述
  • 做题思路,解决过程
    • 思路:
    • 踩过的坑:
    • 核心代码
      • 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;	//定义变量 n

scanf("%d", &n);	//获取 n 的值
//也可以写成:
//cin >> n;	// C++ 的输入函数

char str[n*4];	//定义二进制数组 str

scanf("%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 语言 / 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;
	else
		num_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’ 数量运行结果

C判断运行结果


  
  

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切片


  
  

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’ 数量运行结果:
Python 判断 ‘A’ 数量


  
  

完整代码

C 语言 完整代码

#include <stdio.h>

int main()
{
	int n, num_A=0;	//定义变量 n 、变量 num_A
	
	scanf("%d", &n);	//获取 n 的值
	
	char str[n*4];	//定义二进制数组 str
	
	scanf("%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;
		else
			num_A++;
	}
	
	printf("%d", num_A);
}

  
  

C++ 完整代码

#include <iostream>

using namespace std;

int main()
{
	int n, num_A=0;	//定义变量 n 、变量 num_A
	
	cin >> n;	//获取 n 的值
	
	char str[n*4];	//定义二进制数组 str
	
	cin >> 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;
		else
			num_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评测


  
  

C++

C++评测


  
  

Python

Python评测


  
  

后记

  通过评测结果可以看出 Python 的代码虽然短,但在耗时、内存占用上远远比不上 C/C++,这也是为什么尽管各大语言兴起,也无法撼动 C/C++ 基石,经典经久不衰是有其道理的。

  这篇文章花了很长时间打磨,从读题、解题再到优化,回顾这一过程也可以说是自己进步的过程,不积硅步无以至千里,不积小流无以成江海,冲!

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

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

相关文章

2025 Java 开发避坑指南:如何避免踩依赖管理的坑?

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

ARM服务器与X86服务器核心区别分析

ARM服务器与X86服务器核心区别分析 一、架构设计与指令集差异 指令集本质‌ ARM‌&#xff1a;基于RISC&#xff08;精简指令集&#xff09;&#xff0c;指令定长且简单&#xff0c;单周期执行效率高&#xff0c;硬件设计复杂度低&#xff0c;适合低功耗场景。 X86‌&#xf…

人口老龄化丨AI健康小屋如何实现防病于未然​

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

记录搭建自己应用中心

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

git版本回退 | 远程仓库的回退 (附实战Demo)

目录 前言1. 基本知识2. Demo3. 彩蛋 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器&#xff0c;无代码爬取&#xff0c;就来&#xff1a;bright.cn 本身暂存区有多个文件&#xff0c;但手快了&…

STM32 的 GPIO和中断

GPIO的简单介绍 内部结构 施密特触发器&#xff08;TTL肖特基触发器&#xff09; 的工作原理&#xff1a; 施密特触发电路&#xff08;简称&#xff09;是一种波形整形电路&#xff0c;当任何波形的信号进入电路时&#xff0c;输出在正、负饱和之间跳动&#xff0c;产生方波或…

【因果推断】(二)CV中的应用

文章目录 因果表征学习因果图 (Causal Diagram)“后门准则”&#xff08;backdoor criterion&#xff09;和“前门准则”&#xff08;frontdoor criterion&#xff09;后门调整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…

分享Matlab成功安装Support Package硬件支持包的方法

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

电子级甲基氯硅烷

电子级甲基氯硅烷是一类高纯度有机硅化合物&#xff0c;主要用于半导体制造、光伏产业及高端电子材料领域。以下从技术特性、应用场景、生产工艺、市场动态及安全规范等方面展开分析&#xff1a; 一、核心特性与技术标准 高纯度要求 电子级甲基氯硅烷的纯度通常需达到99.99% 以…

【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度

目录 引言 一、性能优化&#xff1a;突破数据处理极限&#xff0c;提升运行效率 1.1 智能查询优化器&#xff1a;精准优化数据检索路径 1.2 并行处理技术&#xff1a;充分释放多核计算潜力 1.3 智能缓存机制&#xff1a;加速数据访问速度 二、稳定性提升&#xff1a;筑牢…

热度大幅度下降,25西电经济与管理学院(考研录取情况)

1、经济与管理学院各个方向 2、经济与管理学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、应用经济及学25年相较于24年下降25分&#xff0c;为325分 2、管理科学与工程25年相较于24年保持不变&#xff0c;为375分 3、工商管理学25年相较于24年下降5分…

DeepSeek+Mermaid:轻松实现可视化图表自动化生成(附实战演练)

目录 一、引言&#xff1a;AI 与图表的梦幻联动二、DeepSeek&#xff1a;大语言模型新星崛起2.1 DeepSeek 全面剖析2.2 多场景应用示例2.2.1 文本生成2.2.2 代码编写 三、Mermaid&#xff1a;代码式图表绘制专家3.1 Mermaid 基础探秘3.2 语法与图表类型详解3.2.1 流程图&#x…

今日行情明日机会——20250425

指数依然在震荡&#xff0c;等待方向选择&#xff0c;整体量能不搞但个股红多绿少。 2025年4月25日涨停板行业方向分析如下&#xff1a; 一、核心行业方向及驱动逻辑 一季报增长&#xff08;17家涨停&#xff09; 核心个股&#xff1a;惠而浦、鸿博股份、卫星化学驱动逻辑&am…

一道MySQL索引题

复合索引基础 MySQL中的复合索引(Composite Index)是指由多个列组成的索引。与单列索引不同、复合索引的结构更为复杂&#xff0c;但使用得当可以大幅提升查询性能。 复合索引的工作原理 复合索引的本质是一种有序的数据结、每个列是建立在那个索引前一列存在的情况下、那一…

【linux】设置邮件发送告警功能

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

【手机】vivo手机应用声音分离方案

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

关于Safari浏览器在ios<16.3版本不支持正则表达式零宽断言的解决办法

异常原因 今天在升级Dify版本的时候发现低版本的ios手机出现了以下报错&#xff1a; SyntaxError: Invalid regular expression: invalid group specifier nameError: Invalid regular expression: invalid group specifier name Call Stack 46 eval [native code] (0:0) ./n…

管理+技术”双轮驱动工业企业能源绿色转型

00序言 在“3060双碳”政策目标下&#xff0c;工业领域作为碳排放的主要来源&#xff08;占比约70%&#xff09;&#xff0c;国家出台《工业领域碳达峰实施方案》《加快推动制造业绿色化发展的指导意见》等文件&#xff0c;明确行业碳达峰时间表和重点任务&#xff0c;完善碳市…

每天学一个 Linux 命令(30):cut

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/30/index.html cut 命令用于从文件或输入流中提取文本的特定部分(如列、字符或字节位置)。它常用于处理结构化数据(如 CSV、TSV)或按固定格式分割的文本。以下是详细说明和示例: 命令格式 cut [选项] [文件...]…

智慧养老综合实训室规划与实施:产教融合的智慧养老实践

智慧养老综合实训室作为智慧养老、智慧康养产业发展的关键支撑&#xff0c;深度融合物联网、大数据、人工智能等前沿技术&#xff0c;搭建虚实结合的教学场景&#xff0c;依托DeepSeek知识库模型实现知识的高效转化与创新&#xff0c;旨在打造产教融合的实践平台&#xff0c;为…