CSP 202112-3 登机牌条码
更新:2023-5-15
感谢这位同学提出的代码错误,经过改正后,已经可以满分通过了,博客中出现的相应代码也都改正过了,可以直接提交

题目链接
大模拟 做这类题首先一定要读懂题目,这种题往往不会有什么很高深的算法,就是对整个过程的一个模拟,一定要完全理解了题目的整个内容之后再开始写代码
题目整体可以分为两部分,第一部分是求数据码字,第二部分是求校验码,其中数据码字比较好求,看懂题目跟着题目走就可以了,求出数据码字就可以水40分了,后面的难点在于求校验码,这里我的代码只拿到了60分,但没有找到出错的地方,下面给大家详细写一下我的思路,希望能帮助到大家,如果大家找出了我代码中的错误,还请不吝赐教。
数据码字的求解求数据码字就是给你一个字符串然后对其进行一个编码,其中各个字符所对应的值题目中都已经给出了,唯一需要注意的点就是三种模式的切换。
首先可以先写一个transmode函数用来进行三种模式的切换
void transmode(vector &vec, int &oldm, int newm)
{
if (oldm == 1)
{
if (newm == 2)
vec.push_back(27);
if (newm == 3)
vec.push_back(28);
}
if (oldm == 2)
{
if (newm == 1)
{
vec.push_back(28);
vec.push_back(28);
}
if (newm == 3)
vec.push_back(28);
}
if (oldm == 3)
{
if (newm == 1)
vec.push_back(28);
if (newm == 2)
vec.push_back(27);
}
oldm = newm;
}
有了模式切换之后就可以对字符串进行一个初步的编码,定义一个mode变量用来保存当前的模式,遍历字符串,首先切换到当前字符的模式,然后加入字符的编码即可,最后注意是否需要填充字符,全部字符转换完成后,按照题目要求两两一组计算码字即可
vector bianma(string s)
{
vector ret;
int mode = 1; //当前模式:1:大写;2:小写;3:数字
for (char c : s)
{
if (isupper(c)) //大写字母
{
//将模式换为大写
if (mode != 1)
transmode(ret, mode, 1);
ret.push_back(c - 'A');
}
if (islower(c)) //小写字母
{
//将模式换为小写
if (mode != 2)
transmode(ret, mode, 2);
ret.push_back(c - 'a');
}
if (isdigit(c)) //数字
{
if (mode != 3)
transmode(ret, mode, 3);
ret.push_back(c - '0');
}
}
if (ret.size() % 2 != 0)
ret.push_back(29);
vector mazi;
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?