当前位置: 首页 > news >正文

【竞赛经历】CSDN第41期竞赛题解

1 前言

  本次的竞赛主要是最后一题,对于完全不懂珠算的人来说还是有点困难的,仅理解题目的意思就花了很多时间,最后侥幸拿了第一个前三。。。
在这里插入图片描述

2 题解

  本次竞赛分为编程题部分和非编程题部分,其中非编程题部分比较简单。

2.1 非编程题部分:

在这里插入图片描述

这道题我一开始的理解是,算盘可以记录计算的中间过程,同时可以辅助计算,这样就能充分利用人脑的计算能力,但是题目来源的那本书上好像不是这么理解的,chat-gpt也认为不对,那基本实锤了。

在这里插入图片描述

这道题应该没啥疑问

在这里插入图片描述

这个不知道得问度娘,关键词:机械计算机,1642

在这里插入图片描述

这道题答案有问题,后续官方给更正了。算是一道相对简单的心算题,关键是记住常见的2的n次方,如2^7=128, 2^10=1024等

2.2 第1道编程题:数制转换

  • 题目

  由于人类长了十根手指,所以人类的计数最常用的数制就是十进制。 但是,计算机中最常用的进制是二进制,因为二进制可以用比较少的物理状态来表示。 可是二进制只有0和1两个数字,很容易写得很长,所以也经常使用八进制或十六进制。
  八进制的数使用0到7八个数字来表示,逢八进一。 十六进制的数除了0到9这十个数字以外,还使用A到F这六个字母(A到F分别代表十进制的10到15)一共十六个符号来表示,逢十六进一。 请把输入的数字转换为十进制。 如果数字中只有0和1,那么就认为是二进制。 如果数字中只有0到7,那么就认为是八进制。 如果数字中有不止0到7,那么就认为是十六进制。 如果出现了0到9、A到F(不区分大小写)之外的字母,那么就请输出“NaN”

  • 分析

  在python当中数制转换非常简单int(n, 2)即表示将n转换为二进制表示。另外就是需要判断当前数的进制,这个可以将数字转换为字符串,然后判断ASCII最大的字符所在区段,从而判断进制。

  • 代码
b = input()
a = '0123456789abcdefABCDEF'
t = all((x in a) for x in b ) #b中的全部字符在a中输出True,否则False
if not t:print('NaN')
else:c = max(list(ord(x) for x in b))
if c <= ord('1'):print(int(b, 2))
elif ord('1') < c <= ord('7'):print(int(b, 8))
elif ord('8') <= c <= ord('f'):print(int(b, 16))

2.3 第2道编程题:珠算指令生成器

  • 题目

  现代人做两个数的加减法运算,是非常简单的事情:只要在计算器上按出第一个数,再按一下“+”或“-”键,再按出第二个数,最后按一下“=”键,就能够看到运算的结果了。但古代人没有计算器,还好古代中国有算盘这种工具。 CSDN的zjg55543同学在博客里给出了珠算加减法用到的口诀表:珠心算口诀表_zjg555543的博客-CSDN博客。

  请你尝试把根据输入数的加减运算生成相应的珠算指令序列,每个指令对应于一句或若干句口诀,并该口诀之前输出其所应用的位置和该口诀所涉及的拨珠次数。

  个位记为位置0、十位记为位置1、百位记为位置2,以此类推。同样地,十分位记为位置-1,百分位记为位置-2,以此类推。

  有的口诀只需要拨动一次上珠或下珠,如“一上一”和“五下五”等。有的则需要拨动一次上珠和一次下珠,如“六上六”、“九下九”、“三下五去二”和“八退一还五去三”(“进一”或“退一”是从相邻高位进一或退一,并不需要在该位执行这一口诀时实际拨珠)等。

  最后,输出总拨珠次数。

  • 分析
      个人觉得遇到这种复杂的问题,一定要先想清楚逻辑,然后转换为多个函数,想清楚每个函数的输入输出,然后再整合起来。
      当然,在分析过程当中,如果有想不清楚的一定要用笔记录一下,在纸上推演。
      回到这道题,首先要理解珠算口诀,各个数字代表的含义以及为什么要先下再去,为什么要先退再还,它们各自针对的是哪一位。
      理解珠算口诀之后,再来分析一下:

    • 我们需要将每个数字都拆分成一个字符列表,每一位对应一个数,然后分别去做加减,同时要更新一个总的状态。
    • 对于每一位在计算时,会有一个原数和一个加数,原数保证是正的(题目中给出的说明),加数可正可负。需要根据原数和加数,一方面算出进位和计算完毕之后的取值以及这一位对应的口令,一方面还要计算这一位需要拨动算珠的次数(一般就是1或者2)
    • 如果有连续进位或者连续退位,要考虑。可以用while循环判断更新的进位变量。
  • 代码

import sys
s = []
ss = []
while True:line = sys.stdin.readline()if not line: breaks.append(line)for item in s:if item != '\n':ss.append(item.strip())
# 以上可以作为一个有输入EOF的python代码n = 0
def num2status (s:str):# 将一个数字转换成一个字符list,便于后续分析# "-13.2" -> [0,-2,-3,-1,0,0,0]flag = s[0]=="-"s = s.replace("-","")a, b = (s+".").split(".")[:2]s = a.rjust(8,"0") + b.ljust(3,"0")r = [ -i if flag else i for i in map(int,s[::-1]) ]return rdef toggleCnt(n1, n2):'''对于某一位上,数字的变化输出需要拨动的次数'''if(max(n1,n2) < 5): return 1elif(n1<5 and n2>=5): return 2elif(n1>=5 and n2>=5): return 1elif(n1>=5 and n2<5): return 2dic1 = { #加法口令1: ['一上一', '一下五去四', '一去九进一', ''],2: ['二上二', '二下五去三', '二去八进一', ''],3: ['三上三', '三下五去二', '三去七进一', ''],4: ['四上四', '四下五去一', '四去六进一', ''],5: ['五上五', '五上五', '五去五进一', ''],6: ['六上六', '六上六', '六去四进一', '六上一去五进一'],7: ['七上七', '七上七', '七去三进一', '七上二去五进一'],8: ['八上八', '八上八', '八去二进一', '八上三去五进一'],9: ['九上九', '九上九', '九去一进一', '九上四去五进一']
}
dic2 = { #减法口令1: [ "一下一", "一上四去五", "一退一还九", "" ],2: [ "二下二", "二上三去五", "二退一还八", "" ],3: [ "三下三", "三上二去五", "三退一还七", "" ],4: [ "四下四", "四上一去五", "四退一还六", "" ],5: [ "五下五", "", "五退一还五", "" ],6: [ "六下六", "", "六退一还四", "六退一还五去一" ],7: [ "七下七", "", "七退一还三", "七退一还五去二" ],8: [ "八下八", "", "八退一还二", "八退一还五去三" ],9: [ "九下九", "", "九退一还一", "九退一还五去四" ],
}
def addOrSub(x, y):'''根据当前数(x)和加数(y, 可正可负),来输出口令'''if y<0:op='-'y=-yelse:op='+'if op == '-':s = x-yif s<0: #退位减s += 10z = -1if y>5:if x<=y-6:q = dic2[y][2]else:q = dic2[y][3]else:q = dic2[y][2]else:z = 0if x>=5:q = dic2[y][1]else:q = dic2[y][0]else:s = (x+y)%10 #当前位结果z = (x+y)//10 #进位q = ''if(z>0):if(x<5):q = dic1[y][2]else:q = dic1[y][3]else:if(s < 5):q = dic1[y][0]elif(s >= 5):q = dic1[y][1]return s,z,q # 位值 进位  口令state = [0]*(3+8)
# 遍历每个字符串
for s in ss:
# 遍历字符串的每一位,从后往前
for idx in range(3+8):b = num2status(s)[idx]if b==0: continuer = b# 当有进位时,往前遍历while r:c, r, q = addOrSub(state[idx], r)# 位置、拨动次数、口令x = toggleCnt(state[idx],c)n+=xprint (idx-3, toggleCnt(state[idx],c), q)state[idx] = cidx += 1print(n)
  • 后续
      当时这个代码提交之后,准确率只有1/3(好像大家都是这个分数?不太清楚为啥),后来复盘发现应该是其中的addOrSub函数写得不够全面,对于很多情况考虑存在问题,于是想了一个最直接的办法,把所有情况直接列出来!然后再按照原位数字和加数来查找口令。代码如下:
table = (" - S1   S2   S3   S4   S5   S6     S7     S8     S9     T1H1   T1H2   T1H3   T1H4   T1H5 T1H6 T1H7 T1H8 T1H9 \n" # 0" - S1   S2   S3   X5Q1 S5   S6     S7     S8     Q1J1   T1H1   T1H2   T1H3   T1H5Q1 T1H5 T1H6 T1H7 T1H8 X1   \n" # 1" - S1   S2   X5Q2 X5Q1 S5   S6     S7     Q2J1   Q1J1   T1H1   T1H2   T1H5Q2 T1H5Q1 T1H5 T1H6 T1H7 X2   X1   \n" # 2" - S1   X5Q3 X5Q2 X5Q1 S5   S6     Q3J1   Q2J1   Q1J1   T1H1   T1H5Q3 T1H5Q2 T1H5Q1 T1H5 T1H6 X3   X2   X1   \n" # 3" - X5Q4 X5Q3 X5Q2 X5Q1 S5   Q4J1   Q3J1   Q2J1   Q1J1   T1H5Q4 T1H5Q3 T1H5Q2 T1H5Q1 T1H5 X4   X3   X2   X1   \n" # 4" - S1   S2   S3   S4   Q5J1 S1Q5J1 S2Q5J1 S3Q5J1 S4Q5J1 T1H1   T1H2   T1H3   T1H4   X5   S1Q5 S2Q5 S3Q5 S4Q5 \n" # 5" - S1   S2   S3   Q6J1 Q5J1 S1Q5J1 S2Q5J1 S3Q5J1 Q1J1   T1H1   T1H2   T1H3   X6     X5   S1Q5 S2Q5 S3Q5 X1   \n" # 6" - S1   S2   Q7J1 Q6J1 Q5J1 S1Q5J1 S2Q5J1 Q2J1   Q1J1   T1H1   T1H2   X7     X6     X5   S1Q5 S2Q5 X2   X1   \n" # 7" - S1   Q8J1 Q7J1 Q6J1 Q5J1 S1Q5J1 Q3J1   Q2J1   Q1J1   T1H1   X8     X7     X6     X5   S1Q5 X3   X2   X1   \n" # 8" - Q9J1 Q8J1 Q7J1 Q6J1 Q5J1 Q4J1   Q3J1   Q2J1   Q1J1   X9     X8     X7     X6     X5   X4   X3   X2   X1   \n" # 9# 0 +1   +2   +3   +4   +5   +6     +7     +8     +9     -9     -8     -7     -6     -5   -4   -3   -2   -1
)abbr = {"0": "〇", "1": "一", "2": "二", "3": "三", "4": "四", "5": "五", "6": "六", "7": "七", "8": "八", "9": "九","S": "上", "X": "下", "Q": "去", "J": "进", "T": "退", "H": "还",
}table = [ [ (str(abs(b))+j).translate(str.maketrans(abbr))for b,j in zip(list(range(0,10))+list(range(-9,0)),i.split()) ]for i in table.split("\n")[:-1] ]def addOrSub (a:int, b:int):cc = a + bc = cc%10; r = 1 if cc>9 else -1 if cc<0 else 0; q = table[a][b]return c, r, q

相关文章:

【竞赛经历】CSDN第41期竞赛题解

1 前言 本次的竞赛主要是最后一题&#xff0c;对于完全不懂珠算的人来说还是有点困难的&#xff0c;仅理解题目的意思就花了很多时间&#xff0c;最后侥幸拿了第一个前三。。。 2 题解 本次竞赛分为编程题部分和非编程题部分&#xff0c;其中非编程题部分比较简单。 2.1 非编…...

【Linux学习】信号——预备知识 | 信号产生 | 核心转储

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 信号&#x1f514;信号&#x1f3b5;预备知识&#x1f3b5;信号处理方法的注册&#x1f514;信号…...

2023中国程序员薪酬报告出炉,你拖后腿了吗?

程序员薪资高已是公认的事实&#xff0c;但是具体高到什么程度呢&#xff1f;近期&#xff0c;全球人力服务公司 Michael Page Internatioal 就发布了《2023 中国大陆薪酬报告》&#xff0c;揭示了中国程序员的薪酬情况。 该报告中一共调研了国内 7 个行业以及 6 大城市不同职…...

Mac下Python3安装及基于Idea开发

本篇文章带大家基于Mac OS操作系统&#xff0c;下载、安装Python环境&#xff0c;并基于Idea编写第一个Demo。 Python3安装 访问Python官网&#xff1a;https://www.python.org/。找到“Download”菜单&#xff0c;点击下载&#xff1a; 此处下载的为Mac的安装包&#xff0c…...

2017年 团体程序设计天梯赛——题解集

前言&#xff1a; Hello各位童学大家好&#xff01;&#x1f60a;&#x1f60a;&#xff0c;茫茫题海你我相遇即是缘分呐&#xff0c;或许日复一日的刷题已经让你感到疲惫甚至厌倦了&#xff0c;但是我们真的真的已经达到了我们自身极限了吗&#xff1f;少一点自我感动&#xf…...

“唯一靶点”的华堂宁会成控糖爆品吗?

一上市&#xff0c;两次“断货”的货华堂宁有爆品那味儿了。 2022年10月28日华领医药-B&#xff08;02552.HK&#xff09;公告华堂宁&#xff08;多格列艾汀&#xff09;正式进入商业化&#xff0c;一周后各个渠道便进入到了断货和限售的状态。 对于一个不在传统九大降糖药品…...

Spring《三》DI依赖注入

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 上一篇&#xff1a;Spring《二》bean的实例化与生命周期 下一篇&#xff1a;敬请期待 目录一、setter注入&#x1f349;1.注入引用数据类型2.注入简单数据类型二、构造器注入&#x1f34a;1.注入引用数据类型2.简单数…...

leetcode 面试题 17.06. 2出现的次数

编写一个方法&#xff0c;计算从 0 到 n (含 n) 中数字 2 出现的次数。 示例: 输入: 25 输出: 9 解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 应该算作两次) 该问题用的方法数数组dp&#xff0c;首先我通过总结规律写出了相关的code。使用一个dp数组记录10i10^i10i以内会出…...

CMake入门教程【基础篇】5.configure_file构建配置

configure_file配置文件 文章目录 知识点实例代码目录代码实现知识点 configure_fileconfigure_file 源文件转换为目标文件 实例 代码目录 |-📁prj4   |-- 🎴CMakeLists.txt   |-- 🎴TutorialConfig.h.in   |-- 🎴tutorial.cxx 代码实现 /prj4/CMakeLists.…...

软件开发可行性分析——健康食谱小程序

关于软件开发可行性分析先给大家介绍下面几个关键点&#xff1a; 什么是可行性分析&#xff1f; 检查并确定是否值得为项目或产品投入时间、金钱和资源。这样的评估活动称为“可行性分析”。 为什么要进行可行性分析&#xff1f; 在软件项目开发过程中&#xff0c;只要资源…...

ShuffleNet V1 对花数据集训练

目录 1. shufflenet 介绍 分组卷积 通道重排 2. ShuffleNet V1 网络 2.1 shufflenet 的结构 2.2 代码解释 2.3 shufflenet 代码 3. train 训练 4. Net performance on flower datasets 1. shufflenet 介绍 shufflenet的亮点&#xff1a;分组卷积 通道重排 mobilenet …...

测试人员转型是大势所趋:我的10年自动化测试经验分享

做测试十多年&#xff0c;有不少人问过我下面问题&#xff1a; 现在的手工测试真的不行了吗&#xff1f; 测试工程师&#xff0c;三年多快四年的经验&#xff0c;入门自动化测试需要多久&#xff1f; 自学自动化测试到底需要学哪些东西&#xff1f; 不得不说&#xff0c;随着行…...

Pandas高级操作,建议收藏(一)

在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作&#xff0c;有时需要对数据增删字段。下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序的使用。 复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为大家介绍如何…...

ASIC-WORLD Verilog(1)一日Verilog

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…...

数据治理工具项目投标书技术部分-V1.6

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 项目背景 二、项目目标 提供一套后勤数据治理工具部署文件及配套文档&#xff0c;主要技术指标如下&#xff1a; &#xff08;1&#xff09;具备数据抽取转换装载、元数据管理、…...

ARMv8如何读取cache line中MOESI 状态以及Tag信息(tag RAM dirty RAM)

本文以Cortex-A53处理器为例&#xff0c;通过访问 处理器中的内部存储单元&#xff08;tag RAM和dirty RAM&#xff09;&#xff0c;来读取cache line 中的MOESI信息。 Cortex-A53提供了一种通过读取一些系统寄存器&#xff0c;来访问Cache 和 TLB使用的一些内部存储单元的机制…...

学习通学习--脚本

刷客就爱学学习-首页 (xxbwk.top) 所有科目答案可以网上找超星尔雅学习通《形势与政策》2023年春章节测试答案 (3gmfw.cn) 学习通全部答案 萌面人 – 萌面人官网 (mengmianren.com) 自动答题教程 想要使用自动答题功能&#xff0c;只需要一个配置项就可以让OCS脚本拥有自动答…...

C盘的深度清理

随着反复安装和移除软件&#xff0c;c盘虽然给了80或者100G的空间&#xff0c;也经不住垃圾文件的堆积。居然只剩下几兆空间了。真是可气&#xff0c;某些软件虽然移除了。但是他们不负责自己产生的文件夹和文件的深度清理。 1. 清理系统的垃圾 2. 移动或者清理大文件。 某…...

43掌握自动化运维工具 Puppet 的基本用法,包括模块编写、资源管理

Puppet是一种自动化配置管理工具&#xff0c;可以自动化地部署、配置和管理大规模服务器环境。本教程将介绍Puppet的基本用法&#xff0c;包括模块编写和资源管理。 模块编写 在Puppet中&#xff0c;模块是一组相关的类、文件和资源的集合。模块可以用于部署和配置应用程序、服…...

【新2023Q2押题JAVA】华为OD机试 - 硬件产品销售方案

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:硬件产品销售方案 题目描述 …...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...