【CODEMATE】BPC1:进制转换(transform) 粤港澳青少年信息学创新大赛 C++/Python 小学组/初中组/高中组 字符串/位运算/切片/进制 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(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值