imtoken官网最新下载|pta程序设计辅助平台

作者: imtoken官网最新下载
2024-03-07 20:41:43

PTA | 程序设计类实验辅助教学平台

| 程序设计类实验辅助教学平台杭州·百腾教育检查网络连接 访问备

PTA - 产品介绍

- 产品介绍首页产品教育部合作项目加入我们关于我们English首页产品教育部合作项目加入我们关于我们English01什么是“拼题A”“拼题A”(https://pintia.cn)是浙江大学国家级程序设计系列课程教学团队与网易公司、杭州百腾教育科技有限公司合作,于2015年9月推出面向高校和社会的程序自动评测、开放式的教学辅助平台。 系统创建之初,全称为“程序设计类教学辅助教学平台”(Programming Teaching Assistant,亦简称 PTA)。 发展到今天,已不限于计算机程序设计类课程的辅助教学,而是将功能延伸到覆盖了各个学科0余门课程。“拼题A”是以浙江大学近20年来在程序设计能力培养、精品与资源共享课程建设、在线开放课程建设、教学团队建设等方面的工作为基础,针对程序设计、数据结构等程序设计类课程的实践性特征,重点结合新兴的在线课程建设需求和不同层次学校在程序设计类课程方面的实践教学的需求而设计的。 “拼题A”致力于打造面向学校与企业的优质教学资源的共建、共享平台,开创了互联网时代多校多企共同参与、共同建设、共同利用教育资源的新模式。 相关的探索与实践工作获得 2016 年浙江省高等教育教学成果一等奖,并且是 2018 年全国高等教育教学成果一等奖的重要内容之一。 近年来成为教育部首批新工科研究与实践项目(2019年)、科技部科技创新2030-“新一代人工智能”重大项目(2020年)、国家自然科学基金重点项目(2020年)、教育部新兴领域教材研究与实践项目“围绕在线实践成效的教材建设与使用模式研究与实践”(2021年)和“国家级程序设计类课程虚拟教研室”(2022年)研究的支撑平台。 在2020年新冠肺炎疫情防控期间,凭借丰富的教学资源与稳定支撑百万师生日常教学的强大表现,被教育部产学合作协同育人项目专家组推荐为“在新冠肺炎疫情防控期间支持高校在线教学的产学合作教学资源”。02“拼题A”能做什么支持20万人同时在线系统保证支持 200,000+人同时在线的作业、测验、考试、竞赛等教学活动,此高可用分布式评测架构已申请国家发明专利。支持多种题型题库支持判断、选择(单选、多选)、填空(包括程序填空、函数填空)、编程(包括常规编程、多文件编程、数据库编程)、主观等题目类型,并为使用者提供智能推荐。支持多种判题模式支持日常教学、大规模互评、ACM-ICPC规则、企业招聘等多种判题模式。为教学质量提供全方位保障提供代码/文本查重、随机组卷、线上/线下监考等高级功能,为教学质量提供全方位保障。即时的答疑系统提供人工与智能混合答疑系统,为学习者提供即时帮助。03谁在用“拼题A”0所高校/企业/中小学/竞赛机构/考试机构/培训机构0位教师/人力资源主管贡献了涉及0门课程0个知识点的0道题目实施了0场作业/考试/竞赛/招聘帮助了0位学习者积累了超过0次提交纪录如何用“拼题A”Component/48px/num1_hCreated with Sketch.学校教师Component/48px/num2_hCreated with Sketch.企业Component/48px/num3_hCreated with Sketch.标准化考试Component/48px/num4_hCreated with Sketch.竞赛可自行出题,参与题库共建;亦可使用他人共享的题目可自行组织作业/测验/考试(包括随机组卷、学生互评等功能)可自行导入班级学生名单可导出成绩单、学生答卷、得分代码、正答率分析、试卷分析可进行代码/文档查重可配置本地服务器,在局域网内完成考试,在主站完成最终评测可设置监考,全面监视考生在考试中的行为当前最大规模案例人- 权限申请方式 -请在“拼题A”官网自行注册账号前往个人中心-账号-角色-申请教

C/C++程序基础练习题(二) - 哔哩哔哩

+程序基础练习题(二) - 哔哩哔哩 C/C++程序基础练习题(二)左手边有只橘猫

关注专栏/C/C++程序基础练习题(二)C/C++程序基础练习题(二)

2024年03月05日 12:16--浏览 ·

--喜欢 ·

--评论

左手边有只橘猫粉丝:6文章:4

关注题目来源:PTA|程序设计类实验辅助教学平台题目:写出这个数:读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。输出格式:在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。代码C语言,运行软件 :VS2022#includeint main(){    long int n;int i;int N[100] = { 0 };int sum = 0;int SUM[100] = { 0 };    scanf_s("%ld", &n);    for (i = 0;n>0;i++)    {        N[i] = n % 10;        n = n / 10;        sum += N[i];    }    for (i = 0;sum>0;i++)    {        SUM[i] = sum % 10;        sum = sum / 10;        switch (SUM[i])        {        case 0:printf(" ling ");break;        case 1:printf(" yi ");break;        case 2:printf(" er ");break;        case 3:printf(" san ");break;        case 4:printf(" si ");break;        case 5:printf(" wu ");break;        case 6:printf(" liu ");break;        case 7:printf(" qi ");break;        case 8:printf(" ba ");break;        case 9:printf(" jiu ");break;        }    }    return 0;}测试用例:1234567890输出结果:wu si如图所示过程反省:忽略了switch case搭配:当case之后不带break,则会将后面的case选项依次输出,所以在本题里每一个case后都应该带一个break;在编写代码途中,一直很苦恼数组的存储空间究竟该设置为多少,当我将SUM设置为SUM[100]且第二个for循环设置循环条件为i<100,输出结果会将其中不用输出的0给一起输出,导致输出的结果冗杂;然后我想了一个办法,不设置i的循环条件,而是去设置关于n的循环条件,当n小于等于0的时候就不参与循环,同理第二个for循环也设置关于sum的循环条件,这样我只要做一次sum的取余,我就可以输出一个结果,就不用再操心数组的大小了;由于2中,我设置的是n>0,所以当n<0时,无法输出结果,因此我的程序仍需要改进,另外按照网站所给出的测试用例:1234567890987654321123456789,我无法输出结果,应该是我对n设置的ld小了,这也是一个需要改进的点本文禁止转载或摘编

分享到:

投诉或建议评论目录----

关于PAT考试? - 知乎

关于PAT考试? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册算法浙大PAT关于PAT考试?我是一名大三的学生,已经学习了有关C与C++的一些内容,但对算法还是一无所知,想请问一下若参加明年上半年的PAT乙级考试需要哪些准备?时间是否来得及,…显示全部 ​关注者94被浏览180,022关注问题​写回答​邀请回答​好问题 3​1 条评论​分享​8 个回答默认排序陈越姥姥攀拓PAT,IT业的托福​ 关注PTA(程序设计类实验辅助教学平台)正在举办PAT顶级、甲级、乙级的模拟考试,注册账号后就可以去试试看。做完后可以自我评估一下,现在的能力可以达到什么水平。如果你仅仅学了基础编程的话,可能还需要学一下数据结构中的“排序算法”部分,乙级最难的一题有可能涉及。剩下的就是熟练度啦 —— 毕竟你只有3小时,还是闭卷。不需要什么特别好的书,随便一本语言类教材都可以,平时多多练习还是很必要的。PAT官网(PAT | 计算机程序设计能力考试)的“考题练习”有历届真题可供自我训练。PTA也有不少基础训练的题目可以帮助你刷熟练度 —— 话说PTA上有两本C语言教材(和辅助教材)的读者专有题库,你买其中一本书就可以得到读者码做两个题库了,书也不错,还是挺合算的。发布于 2015-09-08 14:24​赞同 130​​83 条评论​分享​收藏​喜欢收起​金志超热衷用计算机解决问题​ 关注使用 vscode-pintia 插件高效地在 VS Code 刷题插件首页地址:更新 - 2023/01/24新增如下功能添加插件演练以指导如何使用该插件,在命令面板中键入 Get Started: Open Walkthroughs.. 增加题目搜索功能,及其对应命令 Pintia: Search Problem 在代码编辑器中添加 Preview 快捷命令以重新预览题目在题目预览中,增加搜索引擎与题解入口以快速搜索题目添加 Java 语言的常用模板(BufferReader、Scanner)根据 VS Code 的使用语言自动切换命令的中英文2. Bug 修复修复提交测试时的错误添加自定义样例时,由 Line Comment 改为 Block Comment 0. 功能介绍使用微信二维码扫码登录 Pintia/PTA(暂不支持账号密码登录)本地显示公共题库(需要读者验证码的题集会被标记上锁符号)在 VS Code 中预览题目题目中的输入/输出样例可点击复制向 Pintia/PTA 提交或测试你的 Solution在编辑区中快速添加多个自定义测试样例自动签到 Pintia/PTA 的教育超市1. 插件安装在本地安装 VS Code在 VS Code 的插件商店中,搜索关键字pintia或者pta,点击安装。或者点此进入插件主页点击安装进行跳转。2. 使用介绍2.1. 登录/登出在 Pintia Explorer 中点击 Sign in to Pintia ,即可登录PTA(目前,只支持扫描微信二维码登录)亦可使用以下命令来登录/登出Pintia: Sign InPintia: Sign Out2.2. 预览问题与编码点击问题,即可查看问题描述点击右下角的Code New按键,开始编码注:插件中默认选择的语言是C++,可以在设置中或者使用命令面板键入Pintia: Change Default Language来快速修改默认使用的编程语言。部分题集(如教材类题集)指定了可用的编程语言,此时创建源文件则会以规定使用的语言为准,如果指定可用的编程语言有多个(如ZOJ Problem Set题集),则会弹出提示以重新选择想用的编程语言。⭐️ 预览区的输入输出样例点击可复制每道题目的源文件会被创建到用户指定的工作区目录,首次创建源文件时,需要用户选择所用的工作区(默认推荐的工作区目录为 $HOME/.pintia/codes ),或者也可在 VS Code 的设置中修改pintia.workspaceFolder配置项。2.3. 编辑器快捷键Pintia 插件暂支持2个编辑器快捷键Submit:向 Pintia 提交你的答案Test:用自定义的测试样例或默认样例测试你的答案点击Test测试代码时,会自动获取题目中可用的测试样例(并不是问题描述中的输入输出样例)作为默认测试样例,若无默认测试样例插件会予以提示。注:默认的测试样例指的是,Pintia能提供答案的测试样例。使用自定义的测试样例测试代码时,Pintia只会返回你的代码对测试样例的输出而不会返回真实的答案。而使用默认的测试样例时,Pintia会提供正确的输出予以对照(但实际上部分题目即使提供了默认测样样例,Pintia 也不会返回正确输出)。2.4. 自定义测试样例自定义测试样例是为了方便快速测试自己的代码,你可以直接在代码的下方将自定义的测试样例放置在@pintia test=start和@pintia test=end之间(输入ptatest可快速添加),并点击Test custom sample来快速测试。自定义测试样例可添加多个。 注:在代码编辑区点击Submit或者Test提交代码时,只有包裹在@pintia code=start与@pintia code=end中的代码会被提交,区域外的文本内容不会被提交到Pintia,因此这有个小trick,即提交函数题时,可以在源文件中添加完整的代码供本地测试,而将所要提交的函数段代码包裹在上述标识符中。如果误删了上述标识,可在编辑区中输入ptacode来快速添加。2.5. View 菜单在 Explorer 的顶部实现了4个快捷菜单,分别用于:打开 Pintia 官网登录/登出刷新列表Report Issue收起所有列表3. 命令面板为了快速使用相关功能,可以在 VS Code 中使用 Ctrl+Shift+P (in Windows) 或 Command+Shift+P (in Mac)打开命令面板并输入pintia以快速使用插件的相关命令。可用的命令如下:其中,Pintia: Clear Cache命令用于清除缓存,由于 Pintia 中的题目集或题目信息通常是不变的,因此,为了避免发送重复的请求造成资源浪费,插件会将请求到的信息缓存在本地,如果发现本地显示的内容和官网上有冲突可以使用上述命令清除本地缓存后点击Refresh刷新题目列表或者重启 VS Code。4. 插件配置项设置名称描述默认值pintia.showLocked指定是否显示锁定的问题(一些题目集需要验证用户的读者码后方可提交)truepintia.defaultLanguage指定用于解题的默认语言。支持的语言有C (gcc), C++ (g++), C (clang), C++ (clang++), Java (javac), Python (python2), Python (python3), Ruby (ruby), Bash (bash), Plaintext (cat), CommonLisp (sbcl), Pascal (fpc), Go (go), Haskell (ghc), Lua (lua), Lua (luajit), C# (mcs), JavaScript (node), OCaml (ocamlc), PHP (php), Perl (perl), AWK (awk), D (dmd), Racket (racket), Vala (valac), Visual Basic (vbnc), Kotlin (kotlinc), Swift (swiftc), Objective-C (gcc), Fortran95 (gfortran), Octave (octave-cli), R (R), ASM (nasm. sh), Rust (rustc), Scala (scalac), Python (pypy3), SQL (SQL)C++ (g++)pintia.workspaceFolder指定工作区文件夹的路径,以存储代码文件""pintia.enableStatusBar指定是否显示Pintia状态栏truepintia.editor.shortcuts指定编辑器中的自定义快捷方式。目前仅支持submit, test["提交","测试"]pintia.paging.pageSize当问题集过大时,是否对问题列表进行分页。当pageSize为0表示不分页100pintia.autoCheckIn指定当Pintia插件被激活时,是否自动签到Pintia的教育商店false5. 维护计划插件目前刚刚发布,仅实现了较为基础的答题功能,仍处于 Beta 版本,如果在使用过程中出现 Bug,可在 GitHub 上 New Issue。初步预想的一些功能会在后续逐步添加,如:直接使用账号密码登录Pinta/PTA在本地记录答题历史快速搜索题解题目搜索编辑于 2023-01-25 00:18​赞同 16​​添加评论​分享​收藏​喜欢

PTA平台的注册、登录与校园账号绑定_其他_5239ZM-GitCode 开源社区

台的注册、登录与校园账号绑定_其他_5239ZM-GitCode 开源社区 GitCode 开源社区 AI 开源搜索OHG-StarSD GitCode 开源社区 AI 开源搜索OHG-StarSD 去全站搜索看看? 登录 登录社区云 登录社区云,与社区用户共同成长 CSDN账号登录 GitCode 开源社区 邀请您加入社区 立即加入 欢迎加入社区 取消 确定 欢迎加入社区 取消 确定

GitCode 开源社区

PTA平台的注册、登录与校园账号绑定 PTA平台的注册、登录与校园账号绑定

PTA程序设计类实验辅助教学平台的注册、登录与校园账号绑定(下文统称:PTA)网址:https://pintia.cn/点击链接后会跳转到PTA的首页,如下界面:1. 注册:点击PTA首页右上角的“注册”跳转到注册界面:注册:用常用真实邮箱作为帐号,填写完相关信息后点击“注册”后将有一封激活邮件发往您的注册邮箱,请去邮箱中找到该邮件(部分邮件服务器可能错误地将此邮件识别为垃圾邮件,请注意在被过滤的

5239ZM

75793人浏览 · 2021-09-29 23:04:06

5239ZM  ·  2021-09-29 23:04:06 发布 PTA程序设计类实验辅助教学平台的注册、登录与校园账号绑定(下文简称:PTA)

网址:https://pintia.cn/ 点击链接后会跳转到PTA的首页,如下界面:

1. 注册:

点击PTA首页右上角的“注册”跳转到注册界面: 注册:用常用真实邮箱作为帐号,填写完相关信息后点击“注册”后将有一封激活邮件发往您的注册邮箱,请去邮箱中找到该邮件(部分邮件服务器可能错误地将此邮件识别为垃圾邮件,请注意在被过滤的邮件中查找),点击邮件正文中的链接即可激活帐户。 若未收到邮件且提示账号已激活,则点击到登录页面填写账号信息点击“重发激活邮件”点击邮件正文中的链接进行激活。 牢记密码。

2. 登录:

点击PTA首页右上角的“登录”跳转到登录界面: 登录:注册成功,请用注册的邮箱登录

3. 绑定校园账号:

进入个人中心 --> 点击我的绑定 --> 点击绑定新学号 --> 填写相关信息 --> 点击提交 校园账号:点击“绑定新学号”,在弹窗中选择自己的学校(gues - 贵州工程应用技术学院),输入姓名和学号,以及教师发放的验证码,提交即完成绑定。

# 其他

GitCode 开源社区 旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

加入社区

更多推荐

·

算法导论------渐近记号Θ、Ο、o、Ω、ω详解

·

MySQL安装和配置——详细教程

·

在vscode上使用CMake指令的错误总结

算法导论------渐近记号Θ、Ο、o、Ω、ω详解 GitCode 开源社区 MySQL安装和配置——详细教程 一、下载安装包1、进入官网,点击"Dowload"官网地址:https://www.mysql.com/  2、页面往下拉,找到mysql社区版下载mysql社区版是免费的mysql版本,然后我们点击这个链接  3、下载社区版的Server4、选择相应的MySQL版本进行下载点击Archives可以找到MySQL的历史版本找到自己想要的版本,我这里是MySQ GitCode 开源社区 在vscode上使用CMake指令的错误总结 cmake error:cmake_c_compiler not set. GitCode 开源社区 7.5w 4 0 0 扫一扫分享内容 点击复制链接 分享 所有评论(0)

您需要登录才能发言

查看更多评论  欢迎加入社区 取消 确定 5239ZM

@weixin_57542177

已为社区贡献2条内容

回到顶部 欢迎加入社区 取消 确定 提供社区服务与技术支持 提供社区服务与技术支持 ©1999-2023北京创新乐知网络技术有限公司 京ICP备190046

如何评价2021年PAT和拼题A联合发起的第二届520钻石争霸赛? - 知乎

如何评价2021年PAT和拼题A联合发起的第二届520钻石争霸赛? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册520浙大PAT拼题A如何评价2021年PAT和拼题A联合发起的第二届520钻石争霸赛?2021年5月20日,PAT与拼题A第二次联合发起“520钻石争霸赛”( PTA | 程序设计类实验辅助教学平台 )。今年的奖品是一堆粉色软萌娃娃…这…显示全部 ​关注者26被浏览12,868关注问题​写回答​邀请回答​好问题 4​添加评论​分享​10 个回答默认排序金志超热衷用计算机解决问题​ 关注既然是520争霸赛,那奖品为什么不能是一个“女朋友” ( ´◔ ‸◔')编辑于 2021-05-13 21:02​赞同 3​​4 条评论​分享​收藏​喜欢收起​瓦尔基里脊肉咸鱼学生​ 关注如何评价拼题A跨年挑战赛? - 岛田卢西奥的回答 - 知乎 https://www.zhihu.com/question/436477324/answer/1655641457520拿了52分==附上这次做题时间和上次跨年挑战赛的回答。要看分数的话,,毕竟下学期开了数据结构,前两天还去蓝桥杯划水了,,,矩阵那题目思路很明确就没时间了。。大勾股定理说两个答案错误也不知道咋回事后面就没时间看了 打代码速度还是不够 编辑于 2021-05-20 15:19​赞同 2​​3 条评论​分享​收藏​喜欢

【PTA】数据结构与算法题目集 - 知乎

【PTA】数据结构与算法题目集 - 知乎专栏【PTA】数据结构与算法题目集切换模式写文章登录/注册【PTA】数据结构与算法题目集PTA是浙江大学设计类实验辅助教学平台。Nice小夫 · 12 篇内容

C++PTA题解_pta程序设计辅助平台的编译器是什么-CSDN博客

>

C++PTA题解_pta程序设计辅助平台的编译器是什么-CSDN博客

C++PTA题解

最新推荐文章于 2024-03-05 01:01:47 发布

Mine Shin

最新推荐文章于 2024-03-05 01:01:47 发布

阅读量7.3k

收藏

3

点赞数

文章标签:

c++

算法

PTA

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/m0_58767764/article/details/124792617

版权

因为洛谷的题目相对较少,相对简单,而且有官方题解。所以C++洛谷题解的更新率会直线下降,前段时间回答问题发现了PTA,这几天试了一下,很不错。

PTA简介

“PTA程简介全程是Programming Teaching Assisant 程序设计类实验辅助教学平台,简称PTA,下面是PTA详细介绍:

“PTA程序设计类实验辅助教学平台”是由浙江大学主导,杭州百腾教育科技有限公司管理运营,全国高校教师共同建设的程序设计类课程的辅助教学平台。目前,全国882所高校参与,7429位教师共同建设出203887道高质量题目,学生注册用户已达3108565;共有14类固定题目集(涵盖C语言、JAVA语言、Python语言、数据结构、数据库系统和中国高校计算机大赛题库等方面)和55类专业课程题目集(涵盖计算机类、电子类、文学类、外语类及华为认证)。包含判断题、填空题、单选题、多选题、程序填空题、函数题、编程题、主观题、多文件编程题和SQL编程题10种题目类型。

PTA题目

目前有题单15个,比赛若干。题目相对较难,逻辑相对复杂,不适合初学者。但整体来说还是很不错的。

PTA编译器

PTA的编辑器共拥有4个主题,可全屏可半屏,拥有自动联想功能,支持万能头bits/stdc++.h

PTA的编译器采用最新的g++,或者gcc编译器,速度适中。

整体来说也是很好。如果没有本地C++编译器,甚至可以用它替代。

PTA测试点

PTA大都是5个测试点,分为不同分数。但无法下载测试点数据,只提供了一些提示。而且没有官方题解。这是PTA个人感觉最不好的一点。

C++PTA题解简介

为了弥补PTA没有题解的遗憾,又因为C++洛谷题解的整体效果不佳,所以开新章节。大致框架与C++洛谷题解一致。题目全部为支持C++的题目(因为有些题目只支持C)

PTA官网链接

预计C++PTA题解的第一章在今天发布!

优惠劵

Mine Shin

关注

关注

0

点赞

3

收藏

觉得还不错?

一键收藏

打赏

知道了

0

评论

C++PTA题解

没错,Li Programmer开创了最新章节:C++PTA题解,全程是:Programming Teaching Assisant 程序设计类实验辅助教学平台。网址是https://pintia.cn/home

复制链接

扫一扫

PTA基础编程答案

08-24

浙江大学PTA基础编程答案, 代码精练,用c或c++。适合程序设计爱好者学习。

pta题库答案c语言 - C语言PTA平台习题与答案

02-23

pta题库答案c语言

本题要求编写程序,输出一个短句“Welcome to You!”

#include

int main()

{

printf("Welcome to You!\n");

return 0;

}

②.本题要求编写程序,计算华氏温度100°F对应的摄氏温度。计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型。

fahr = 100, celsius = 计算所得摄氏温度的整数值

#include

int main()

{

int fahr = 100;

int celsius = 5*(fahr-32)/9;

printf("fahr = 100,celsius = %d\n",celsius);

return 0;

}

第二章 作业2

①求整数均值本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。

在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位

参与评论

您还未登录,请先

登录

后发表或查看评论

PTA|程序设计类实验辅助教学平台:基础编程题目集:编程题7-2

热门推荐

CPCCY的博客

02-22

4万+

然后是几点

有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。

输入格式:

输入...

PTA程序辅助设计平台—2023年软件设计综合实践_4(数组及字符串)

qq_65628600的博客

10-14

3884

6-1 找最小元素/选择排序 - C/C++ 数组及字符串6-1 找最小元素/选择排序 - C/C++ 数组及字符串(找最小元素)对于给定的包含10个元素的整数数组,设计一个函数,从数组给定的下标范围[i,j]里找到值最小的元素,返回其下标。该函数的原型可以是int findMin(int a[], int i, int j),参数int a[]代表被搜索的数组。以这个函数为基础,可以演化出一种称之为选择排序的算法。

沈阳师范大学大一下册C++语言PTA题目集以及答案(函数题篇)

aanzz的博客

08-19

8957

沈阳师范大学大一下册C++语言PTA题目集以及答案(函数题篇)

设计一个void类型的函数reverse_string,其功能是将一个给定的字符串逆序。例如,给定字符串为“hello”,逆序后为“olleh”。

函数接口定义如下:

/* 函数原型参见main函数 */

裁判测试程序样例:

#include

#include

using namespace std;

/* 你的代码将嵌在这里 */

int main(int argc, char const *argv[])

{

string st

PTA 7-1 天梯赛L1 外卖费 (10 分) C语言AC题解【仅供分享】

喜欢松鼠的博客

04-03

2081

同学们都爱点外卖,外卖费用的计算有点麻烦,请你帮忙编程计算一下。如果外卖重量在1000克以内(含1000克),外卖费4元,超过1000克每500克加收3元,不足500克按500克收费,如果选择加急则另外加5元。

输入格式:

输入为正整数n和是否加急的字符y或n,y表示加急,n表示不加急。

输出格式:

请根据题目要求计算外卖费并输出。

输入样例1:

950 n

输出样例1:

4

输入样例2:

1950 y

输出样例1:

15

#include

int main(void){

PTA总结

好柠檬不许酸

05-30

564

基础

基本数据类型

类型

取值范围

大致范围

int

-2147483648 ~ 2147483647

-2*109~2*109

long long

-2^63 ~ (2^63-1)

-910^18 ~ 910^18

float

-2^128 ~ 2^128

实际精度6~7位

double

-2^1024~2 ^ 1024

实际精度15~16位

char

-128 ~ 127

-128 ~ 127

bool

0(false) or 1(true)

0(false) or

数据结构(Data Structure)(C/C++)PTA习题+课后习题

zuiyv99的博客

01-29

9407

大二学生的期末复习整理材料

PTA第四章答案

m0_73480206的博客

10-23

586

PTA第四章答案

PTA程序设计答案.pdf

10-14

PTA程序设计答案.pdf

蓝桥杯 C++ 历年真题题解

02-29

历届真题 contests 2013 年蓝桥杯 2017 年蓝桥杯 2018 年蓝桥杯 2019 年蓝桥杯 2020 年蓝桥杯 2021 年蓝桥杯 2022 年蓝桥杯 蓝桥杯 C++ 历年真题题解 历届真题 contests ...蓝桥杯 C++ 历年真题题解

第n个奇数及其求和pta题解.docx

11-10

第n个奇数及其求和pta

C++周末舞会题解样例

08-08

C++周末舞会题解样例

C++操作队列题解样例

08-08

C++操作队列题解样例

C++ 数字游戏题解解析

08-07

C++ 数字游戏题解解析

C++:Vector的使用

最新发布

weixin_51142926的博客

03-05

845

vector是表示可变大小数组的序列容器。

关于c++右值的一些理解

qq_40896190的博客

03-04

833

在测试程序中getObj()的返回值就是一个将亡值,也就是说是一个右值,在进行赋值操作的时候如果=右边是一个右值,那么移动构造函数就会被调用。移动构造中使用了右值引用,会将临时对象中的堆内存地址的所有权转移给对象t,这块内存被成功续命,因此在t对象中还可以继续使用这块内存。将亡值:与右值引用相关的表达式,比如,T&&类型函数的返回值、 std::move 的返回值等。,其生命周期与右值引用类型变量的生命周期一样,只要该变量还活着,该右值临时量将会一直存活下去。右值引用就是对一个右值进行引用的类型。

【贡献法】第十一届蓝桥杯省赛第二场C++ A组《子串分值》(c++)

m0_74172965的博客

03-03

314

本题来自第十一届蓝桥杯省赛第二场C++ A组《子串分值》

leetcode c++题解

07-27

引用\[1\]:这段代码是一个解决LeetCode上某个题目的C++实现,具体是一个双指针的解法。该题目是计算一个数组中的积水量。代码中使用了两个指针分别指向数组的左右边界,然后通过比较左右指针所指向的元素的大小,来确定当前位置的积水量。具体的计算方法是,如果左指针所指向的元素小于右指针所指向的元素,则对左指针的左边进行操作,如果左指针所指向的元素大于等于右指针所指向的元素,则对右指针的右边进行操作。在每一次操作中,都会更新左边的最大值和右边的最大值,并计算当前位置的积水量。最后返回总的积水量。\[1\]

引用\[2\]:这段代码是另一个解决LeetCode上某个题目的C++实现,具体是一个深度优先搜索的解法。该题目是计算一个二维网格中从起点到终点的可行路径数量。代码中使用了递归的方式进行深度优先搜索,从起点开始,每次向下或向右移动一步,直到到达终点。在每一步移动中,会判断当前位置是否有障碍物,如果有障碍物则返回0,如果到达终点则返回1,否则继续递归搜索下一步的位置。最后返回总的可行路径数量。\[2\]

引用\[3\]:这段代码是另一个解决LeetCode上某个题目的C++实现,具体是一个动态规划的解法。该题目是计算一个数组中的积水量。代码中使用了动态规划的思想,通过遍历数组中的每个元素,分别计算该元素左边和右边的最大值,并计算当前位置的积水量。最后返回总的积水量。\[3\]

综上所述,这三段代码分别是解决LeetCode上不同题目的C++实现,分别使用了双指针、深度优先搜索和动态规划的方法来解决问题。

#### 引用[.reference_title]

- *1* *3* [Leetcode 热题100 42.接雨水(C++ 多种解法,错过可惜)](https://blog.csdn.net/qq_51933234/article/details/124637883)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item]

- *2* [[C++]Leetcode 不同路径 || 解题思路及详解](https://blog.csdn.net/weixin_62712365/article/details/123951736)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item]

[ .reference_list ]

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

Mine Shin

CSDN认证博客专家

CSDN认证企业博客

码龄3年

暂无认证

83

原创

29万+

周排名

152万+

总排名

20万+

访问

等级

1246

积分

214

粉丝

121

获赞

69

评论

550

收藏

私信

关注

热门文章

VBS实现微信轰炸

31872

配置IDEA运行环境

29369

C++洛谷初赛题解——2021

9371

Windows11安装Android子系统——安装篇

8667

C++PTA题解

7377

分类专栏

C++题目及答案

Python语言讲解

Windows11系统改进

10篇

C++题目及答案——低级篇

7篇

最新评论

Java实现微信轰炸

m0_67423715:

5秒后你鼠标点的位置

Python制作简易浏览器

qq_42732182:

生成exe文件为什么运行立马就关闭了?

配置IDEA运行环境

良小辰_:

问问博主能运行调试吗

C++洛谷初赛题解——2021

Turingxu:

第七题在线进制网站……博主好会开玩笑

C++洛谷初赛题解——2021

名取好难:

太详细了,这么详细的一般都要会员,感谢dalao

%%%

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

C++洛谷初赛题解——2021

C++洛谷题解(38)——P5722

C++洛谷题解(37)——P2669

2022年83篇

目录

目录

分类专栏

C++题目及答案

Python语言讲解

Windows11系统改进

10篇

C++题目及答案——低级篇

7篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

打赏作者

Mine Shin

你的鼓励将是我创作的最大动力

¥1

¥2

¥4

¥6

¥10

¥20

扫码支付:¥1

获取中

扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

PTA平台 · PAT(Basic Level) Practice(中文) 题目集_pta程序设计辅助平台题库-CSDN博客

>

PTA平台 · PAT(Basic Level) Practice(中文) 题目集_pta程序设计辅助平台题库-CSDN博客

PTA平台 · PAT(Basic Level) Practice(中文) 题目集

奶酪博士

已于 2023-10-04 22:44:56 修改

阅读量584

收藏

3

点赞数

1

分类专栏:

Java

文章标签:

java

学习

算法

pat考试

于 2023-06-24 20:37:50 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Dr_Cheeze/article/details/131365216

版权

Java

专栏收录该内容

14 篇文章

0 订阅

订阅专栏

前  言

 ※  PTA是 程序设计类实验辅助教学平台 ,里边包含一些编程题目集以供练习。

 ※  PAT是 浙江大学计算机程序设计能力考试(Programming Ability Test),分为乙级(中文、基础编程)、甲级(英文、基础数据结构)、顶级(国际竞赛水平)。

 ※  本文是PTA平台上收录的PAT乙级真题的参考代码(我自己写的),共115道题,主要用Java语言完成。

目  录

前  言

目  录

1001 害死人不偿命的(3n+1)猜想

1002 写出这个数

1003 我要通过!

1004 成绩排名

1005 继续(3n+1)猜想

1006 换个格式输出整数

1007 素数对猜想

1008 数组元素循环右移问题

1009 说反话

1010 一元多项式求导

1011 A+B 和 C

1012 数字分类

1013 数素数

1014 福尔摩斯的约会

1015 德才论

***后续题目在其它博文中更新***

1001 害死人不偿命的(3n+1)猜想

    题目    

作者 CHEN, Yue

单位 浙江大学

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式:

输出从 n 计算到 1 需要的步数。

    代码    

import java.io.* ; //功能:给定一个正整数,计算验证卡拉兹猜想需要砍半的次数

class Main{ // 空间复杂度O(1)

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int k = Integer.parseInt(br.readLine());

//计算

int i = 0; //计数器,所需要的步数

for(i = 0;k != 1;i++)

if(k%2 == 0) //若k为偶数,就砍一半

k = k/2;

else

k = (3*k+1)/2; //若k为奇数,就将(3n+1)砍一半

//打印

System.out.println(i);

}

}

1002 写出这个数

    题目    

作者 CHEN, Yue

单位 浙江大学

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

    代码    

import java.io.*; //功能:用汉语拼音写出一个数字的个位数字之和

class Main{ //时间复杂度O(n) 空间复杂度O(n) n为数字大小(给定字符串长度)

public static void main(String[] args) throws IOException{

//获取输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = br.readLine();

//计算各位数字之和

int sum = getSum(str);

//获取对应的拼音

String s = getStr(sum);

//打印

System.out.println(s.trim()); //String.trim()去除字符串首尾空格

}

//获取给定字符串的各位数字之和 //时间复杂度O(n) 空间复杂度O(1) n为字符串长度

private static int getSum(String s){

int t = 0;//各位数字之和

String c = "";//当前取出的一个数字的字符串

for (int i = 0; i

c = s.substring(i,i+1);

t = t + Integer.parseInt(c); //求和

}

return t;

}

//获取给定int的每一位的数字拼音字符串 //时间复杂度O(n) 空间复杂度O(n) n为数字大小

private static String getStr(int n){

String[] arr = "ling yi er san si wu liu qi ba jiu".split(" "); //以数组形式建立数字-拼音对照表

String str = n + ""; //将给定int转为字符串

String goal = ""; //最终打印输出的目标字符串

int a = 0; //数字-拼音对照表的索引,也就是数组的角标

for(int i = 0;i

a = Integer.parseInt(str.substring(i,i+1)); //将当前字符转为数字,赋值给a

goal = goal + arr[a] + " "; //以a作为角标,在对照表中找到对应拼音,添加进目标字符串中

}

return goal; //这里返回的目标字符串,尾部带有一个多余的空格。

}

}

1003 我要通过!

    题目    

作者 CHEN, Yue

单位 浙江大学

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。

输入样例:

10

PAT

PAAT

AAPATAA

AAPAATAAAA

xPATx

PT

Whatever

APAAATAA

APT

APATTAA

输出样例: 

YES

YES

YES

YES

NO

NO

NO

NO

NO

NO

    分析     

 首先要分析判定规则。

1.根据第一条规则,字符串中只能有PAT这三个字符,否则判定为NO。

2.根据第二条规则,形如 xPATx 的判定为YES,而x表示0个或多个字符A。由此可知,正确的字符串应该是,P之前可以有字符A(假设数量为a),P与T之间可以有字符A(假设数量为b),T之后可以有字符A(假设数量为c)。字符P和T是必须有且仅能有一个的,而且前后顺序是固定的。至于abc的值有什么具体要求,就要进一步分析了。题目的第二条规则说明,当b=1且a=c时,判定为YES。这可以看做是基础版的规则。

这个基础版的规则,也可以理解为,① c=a=0 , b=1 ② c=a>0 ,b=1 (也可以看做是 c / a = b=1)这两种情况都判定为YES。

3.根据第三条规则,b也可以>1,并且在第二条规则的基础上,每当b = b+1时,c=c+a,也就是说,c / a = b (当a≠0时) 。那么现在也有两种情况可以判定为YES,① c=a=0 , b≥1 ,② a≠0, c / a = b ≥ 1 。这就是判定逻辑。总结一下就是,要求b > 0;且要求 要么c=a=0 ,要么 c / a=b 。

    代码    

import java.io.*; //功能:根据给定规则,判断一组字符串是否正确并打印结果

class Main{ //时间复杂度O(n) 空间复杂度 O(n) n为字符串个数

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

byte n = Byte.parseByte(br.readLine()); //读取待检查的字符串个数

//处理数据

String s =""; //辅助字符串,用于接收当前待检查字符串

String[] arr = new String[n]; //存放对每个字符串的检测结果,YES 或 NO

for (int i = 1;i<=n;i++){

s = br.readLine(); //依次从函数外部读取待检查的字符串

arr[i-1] = getAns(s); //计算该串是否通过的检测结果,并存入数组中

}

//打印输出

for (int i = 0;i

System.out.println(arr[i]);

}

//给定一个字符串,返回判定结果字符串

private static String getAns(String str){ //时间复杂度O(n) 空间复杂度O(1) n为字符串长度

String s = ""; //辅助字符串

byte a = 0,b = 0, c = 0; //a表示P前边有几个A //b表示PT之间有几个A,要求b > 0 //c表示T之后有几个A,要求 要么c=a=0,要么c/a=b

byte flag = 1; //用于标记当前对字符串读取到哪个阶段,初始化标记为第一阶段

exam: for(int i = 0;i

s = str.substring(i,i+1); //读取当前的一个字符

switch(flag){

case 1: //阶段1 计算a的值

if (s.equals("A")) //每读取到一个A,则a+1

a++;

else if(s.equals("P")) //若读取到的字符是P,说明第一阶段结束

flag = 2;

else //若读取到的是其它字符,则不符合规则,直接退出for语句的判断

break exam ;

break;

case 2: //阶段2 计算b的值

if(s.equals("A")) //每读取到一个A,则b+1

b++;

else if(s.equals("T") && b > 0 ) //若读取到的字符是T,说明第二阶段结束

flag = 3; //若符合b>0的要求,则进入下一阶段

else //若不满足b>0的要求,或者读取到的是其它字符,则不符合规则,直接退出for语句的判断

break exam ;

break;

case 3: //阶段3 计算c的值

if(s.equals("A")) //每读取到一个A,则c+1

c++;

else //若读取到的是其它字符,则不符合规则,直接退出for语句的判断

break exam ;

break;

default: //应对意外情况

System.out.println("flag表示有误!");

} //switch语句

} //for语句

if(flag == 3) //依据规则要求判断字符串是否合格

if(c == a && a == 0) //符合规则的情况1:c=a=0,b>0

return "YES";

else if(c / a == b) //符合规则的情况2:c/a=b>0

return "YES";

return "NO"; //若没有完成三个阶段的计数,或者完成了但是最终结果不合格,则判定结果都是NO

} //getAns函数

} //class Main

1004 成绩排名

    题目    

作者 CHEN, Yue

单位 浙江大学

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:

每个测试输入包含 1 个测试用例,格式为

第 1 行:正整数 n

第 2 行:第 1 个学生的姓名 学号 成绩

第 3 行:第 2 个学生的姓名 学号 成绩

... ... ...

第 n+1 行:第 n 个学生的姓名 学号 成绩

其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:

对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例:

3

Joe Math990112 89

Mike CS991301 100

Mary EE990830 95

输出样例: 

Mike CS991301

Joe Math990112

    代码    

import java.io.*; //功能:给定一组学生姓名、学号、成绩,输出最高分与最低分学生信息

class Main{ //时间复杂度O(n) 空间复杂度O(n) n为学生个数

public static void main(String[] args) throws IOException{

//获取输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(br.readLine());//读取学生个数

//读取第一个学生的信息 题目给定n>0,因此一定能读取到至少一个学生的信息

String[] arra = new String[3]; //存储最高分学生的信息

String[] arrb = new String[3]; //存储最低分学生的信息

String[] arrc = new String[3]; //存储当前读取的学生信息

String s = "";

arra = br.readLine().split(" "); //读取第一个学生的信息

arrb = arra; //复制学生信息

//在线处理 在线处理是指,从第二个学生开始,每读取一条信息就立即更新最高分和最低分记录

for(int i=2;i<=n;i++){

arrc = br.readLine().split(" "); //读取当前学生的信息

if(Integer.parseInt(arrc[2]) > Integer.parseInt(arra[2])) //判断是否需要更新最高分记录

arra = arrc;

else if(Integer.parseInt(arrc[2]) < Integer.parseInt(arrb[2])) //判断是否需要更新最低分记录

arrb = arrc;

else //无需更新记录的话,就继续读取下一条

continue;

}

//打印输出

System.out.println(arra[0] + " " + arra[1]); //打印最高分学生信息

System.out.println(arrb[0] + " " + arrb[1]); //打印最低分学生信息

}

}

1005 继续(3n+1)猜想

    题目    

作者 CHEN, Yue

单位 浙江大学

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

输入格式:

每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1

输出格式:

每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。

输入样例:

6

3 5 6 7 8 11

输出样例:

7 6

    代码    

import java.io.*; //功能:给定一组数字,找出在验证卡拉兹猜想过程中的关键数,并降序输出

import java.util.*; //空间复杂度O(n)

class Main{

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String s = br.readLine().trim();

int n = Integer.parseInt(s); //读取待验证的数字个数

//数组初始化

String[] arrStr = br.readLine().split(" +"); //读取待验证数字(String)

int[] arr = new int[n]; //arr数组存储所有待验证的n个正整数(int)

for(int i=0;i

arr[i] = Integer.parseInt(arrStr[i]);

//遍历arr数组,逐个数字验证3n+1猜想

/*思路:arr[]初始存储的是所有待验证的正整数,如果某个正整数被覆盖,就把数值标记为-1 */

int t; //辅助

for(int i=0;i

t=arr[i]; //从数组中读取当前数字

if(t<0) //如果当前数字已被覆盖,就不用再验证了

continue;

while(t>1){ //如果当前数字没有被覆盖,那就验证3n+1猜想,直到结果=1

if(t%2==0) //若为偶数,则直接砍半

t = t/2;

else //若为奇数,则将(3n+1)砍半

t = (3 * t + 1)/2;

for(int j=0;j

if(arr[j]>0 && arr[j]==t){ //如果数组中有某个数字未被覆盖且与当前数字相等

arr[j]=-1; //则将它置为-1,标记为覆盖

break; //数组中其它数字不用看了,因为是互不相等的

}

} //while

}//for

//将关键字降序输出

Arrays.sort(arr); //将数组升序排序

String str = "";

for(int i=n-1;i>=0;i--) //生成待打印的字符串 值为-1的就是被覆盖的,就不打印

if(arr[i]>0)

str = str + arr[i] + " ";

else

break;

System.out.println(str.trim()); //打印输出 去除字符串首尾空格

} //main函数

} //class Main

1006 换个格式输出整数

    题目    

作者 CHEN, Yue

单位 浙江大学

让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。

输入格式:

每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。

输出格式:

每个测试用例的输出占一行,用规定的格式输出 n。

输入样例 1:

234

输出样例 1:

BBSSS1234

输入样例 2:

23

输出样例 2:

SS123

    代码    

import java.io.*; //功能:给定一个正整数,按指定规则重新输出这个数

class Main{ //时间复杂度O(n) 空间复杂度O(n) n为数值大小(给定字符串长度)

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(br.readLine());

int bai = n / 100; //获取百位数

int shi = n % 100 /10; //获取十位数

int ge = n % 10; //获取个位数

//打印

String s = "";

for (int i = 1;i<=bai;i++) //打印百位数

s = s + "B";

for (int i = 1;i<=shi;i++) //打印十位数

s = s + "S";

for (int i = 1;i<=ge;i++) //打印个位数

s = s + i;

System.out.println(s);

}

}

1007 素数对猜想

    题目    

作者 CHEN, Yue

单位 浙江大学

让我们定义dn​为:dn​=pn+1​−pn​,其中pi​是第i个素数。显然有d1​=1,且对于n>1有dn​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N。

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

    代码    

import java.io.*; //给定正整数n,计算不超过n的素数对的数量

class Main{ // 时间复杂度O(n√n) 空间复杂度O(n) n为给定正整数的大小

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(br.readLine()); //正整数n

//处理特殊值

if(n < 5){ //若给定数字<5,则满足猜想的素数对为0,打印结果后返回

System.out.println(0);

return;

}

//计算素数对的数量 //***思路:对于≥6的整数,素数只有可能出现在6n-1或6n+1的位置,n为正整数。

int t = 1; //计数器,素数对个数(初始值为1是预加上3 5 这一对)

for(int i = 1;6*i+1<=n;i++) //遍历n,计算素数对的数量

if(ifsushu(6*i-1) && ifsushu(6*i+1) )

t++;

System.out.println(t); //打印输出

}

//判断一个整数是否是素数 时间复杂度为O(√n) 空间复杂度O(1) n为数值t的大小

private static boolean ifsushu(int t){

//判断特殊值

if(t==2 || t==3 || t==5) return true;

//若尾数不是1 3 7 9 则一定不是素数(6以上的数)

if(t%2==0 || t%5==0) return false;

//若此数不是6n+1或者6n-1,则一定不是素数(6以上的数)

if((t+1)%6!=0 && (t-1)%6!=0) return false;

//遍历检查(合数一定能分解为质数的乘积)

for(int i=1;Math.pow(6*i-1,2)<=t;i++)

if(t % (6*i-1) == 0 || t % (6*i+1) == 0)

return false;

return true;

}

}

1008 数组元素循环右移问题

    题目    

作者 DS课程组

单位 浙江大学

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0​A1​⋯AN−1​)变换为(AN−M​⋯AN−1​A0​A1​⋯AN−M−1​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2

1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

    代码 - C语言    

这道题与2010年考研408真题42题很像,只不过将左移改为了右移。这道题我在 《【考研·数据结构】408真题 (2010年42题) 的三种解法》 这篇博客中单独写了代码实现思路。因为原先做过这道真题,于是在这里我就在录入数据后简单处理,将右移的元素个数转换为左移的元素个数,这样原来的实现代码不变。

408真题的参考答案中给出了两种解法(原地逆置法、辅助数组法),我自己写了第三种解法(循环填空法)。因为是考研真题(要求用C语言),我就用C语言实现了。不过PTA平台上的这道题,要求不能使用额外的数组,因此解法2不适用,就当做一种思路的拓展吧。

#include //C语言

void myprint001(int R[],int n);

void Converse(int R[],int n,int p);

void Reverse(int R[],int from,int to);

void Converse2(int R[],int n,int p);

void myMove(int R[],int n,int p);

int main() { //功能:将数组元素循环右移p个元素

//这与2010年考研408的42题很像,只不过把向左移动改为了向右移动。

//共有三种解法,时空复杂度在每个解法中单独分析

//录入数组数据

int n,p,t,a;

scanf("%d %d",&n,&p);

if(p%n==0) p = 0; //这句不能整合在下一个if语句中

if(p>0) p = n - (p%n); //本来接收的数据p表示要右移的元素个数,经过这一步处理后,转变为要左移的元素个数

int R[n];

for(int i=0;i

a=scanf("%d ",&t);

R[i] = t;

}

a=scanf("%d",&t);

R[n-1] = t;

//myprint001(R,n); //打印初始数组

//解法1:原地逆置法

Converse(R,n,p);

//解法2:辅助数组法

//Converse2(R,n,p);

//解法3:循环填空法

//myMove(R,n,p);

myprint001(R,n); //打印移位后的数组

return 0;

}

//解法1

void Converse(int R[],int n,int p){

/*功能:将数组R的元素循环左移p个位次*/

/*实现思路:

利用三次原地逆置实现。

根据p的位置将数组看做ab两部分,

第一次逆置a,数组变为(-a)b,

第二次逆置b,数组变为(-a)(-b)

第三次逆置整个数组,数组变为ba。*/

/*时间复杂度:O(n);空间复杂度:O(1) */

Reverse(R,0,p-1);

Reverse(R,p,n-1);

Reverse(R,0,n-1);

}

void Reverse(int R[],int from,int to){

/*功能:将数组R中指定角标范围内的部分原地逆置*/

int i,temp; //i是计数器,temp用于暂存元素以便于逆置交换

for(i=0;i<(to-from+1)/2;i++){

temp = R[from+i];

R[from+i] = R[to-i];

R[to-i] = temp;

}

}

//解法2

void Converse2(int R[],int n,int p){

/*实现思路:

利用一个辅助数组S,暂存前p个元素,之后将后面的元素移位,

再将前p个元素移位到正确位置。

*/

/*时间复杂度:O(n) ;空间复杂度: O(p) */

int S[p]; //创建一个辅助数组

for(int i=0;i<=p-1;i++) //将R中前p个元素移到S中

S[i] = R[i];

for(int i=p;i

R[i-p] = R[i];

for(int i=0;i<=p-1;i++) //将S中的元素移到R中正确位置

R[n-p+i] = S[i];

}

//解法3

void myMove(int R[],int n,int p){

/* 接收的参数:

R[] 要重新排序的数组;n 数组R中元素的个数 ;p 要向左移动几位 */

/*功能:

将含有n个元素的int数组R中的元素循环左移p位 */

/*实现思路:

1.将首元素暂存于x,则首元素的位置视为空,接下来逐个移位填空。

移位时,R[i]为目前的空位元素,R[m]为待移动到空位的元素。

当目标元素地址=首地址时,则移位完成。

2.考虑到p可能是n的因数,因此要通过移动次数j判断是否已移动n个元素;

若要移动多轮,则每一轮的移动首元素应+1,

因此,t表示共移动了几轮,R[t]表示本轮移动的首元素

*/

/*时间复杂度:O(n);空间复杂度:O(1) */

/*for循环的参数:

int j=0; //计数 共移动了几个元素

int t=0; //计数 共移动了几轮,R[t]表示本轮移动的首元素

j++; //每移动一次,则j+1

t++; //每移动完1轮,则t+1,t用于计算下一轮的首元素角标

*/

int i,m,x;

for(int j=0,t=0;j

i = t; //设置新一轮的首元素角标

m = i + p; //设置新一轮的目标元素角标

x = R[i]; //将本轮首元素暂存于x

for(;m!=t;j++){ //逐个将目标元素移位到空位处,当m=t,则说明本轮移动完成。

R[i] = R[m]; //将目标元素移到空位元素处

i=m; //计算新的空位元素角标

(i+p<=n-1)?(m=i+p):(m=i+p-n); //计算新的目标元素角标

} //移动完一轮

R[i] = x; //本轮收尾:将暂存在x的首元素移到空位元素处

}

}

void myprint001(int R[],int n){ //功能:打印数组

for (int i=0;i

printf("%d ",R[i]);

}

printf("%d",R[n-1]);

}

    代码 - Java    

下面我再用Java实现一下,作为练习。C语言Java的代码基本相同,主要是录入数据部分、打印部分有差异,还有就是有个三元运算符在C语言中测试通过但是在Java中不通过,原因不明,于是就改写为显式if-else语句。

import java.io.*;

class Main{ //Java

public static void main(String[] args) throws IOException {

//功能:将数组元素循环右移p个元素

//这与2010年考研408的42题很像,只不过把向左移动改为了向右移动。

//录入数组数据

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String[] strArr = br.readLine().split(" +");

int n = Integer.parseInt(strArr[0]); //元素个数n

int p = Integer.parseInt(strArr[1]); //右移元素个数p

int t,a;

if(p%n==0) p = 0;

if(p>0) p = n - (p%n);

String[] strArr2 = br.readLine().split(" +");

int[] R = new int[n];

for(int i=0;i

t = Integer.parseInt(strArr2[i]);

R[i] = t;

}

//myprint001(R,n); //打印初始数组

//解法1:原地逆置法

Converse(R,n,p);

//解法2:辅助数组法

//Converse2(R,n,p);

//解法3:循环填空法

//myMove(R,n,p);

myprint001(R,n); //打印移位后的数组

}

public static void Converse(int R[],int n,int p){ //解法1

/*功能:将数组R的元素循环左移p个位次*/

/*实现思路:

利用三次原地逆置实现。

根据p的位置将数组看做ab两部分,

第一次逆置a,数组变为(-a)b,

第二次逆置b,数组变为(-a)(-b)

第三次逆置整个数组,数组变为ba。*/

/*时间复杂度:O(n);空间复杂度:O(1) */

Reverse(R,0,p-1);

Reverse(R,p,n-1);

Reverse(R,0,n-1);

}

public static void Reverse(int R[],int from,int to){

/*功能:将数组R中指定角标范围内的部分原地逆置*/

int i,temp; //i是计数器,temp用于暂存元素以便于逆置交换

for(i=0;i<(to-from+1)/2;i++){

temp = R[from+i];

R[from+i] = R[to-i];

R[to-i] = temp;

}

}

public static void Converse2(int R[],int n,int p){ //解法2

/*实现思路:

利用一个辅助数组S,暂存前p个元素,之后将后面的元素移位,

再将前p个元素移位到正确位置。

*/

/*时间复杂度:O(n) ;空间复杂度: O(p) */

int[] S = new int[p]; //创建一个辅助数组

for(int i=0;i<=p-1;i++) //将R中前p个元素移到S中

S[i] = R[i];

for(int i=p;i

R[i-p] = R[i];

for(int i=0;i<=p-1;i++) //将S中的元素移到R中正确位置

R[n-p+i] = S[i];

}

public static void myMove(int R[],int n,int p){ //解法3

/* 接收的参数:

R[] 要重新排序的数组;n 数组R中元素的个数 ;p 要向左移动几位 */

/*功能:

将含有n个元素的int数组R中的元素循环左移p位 */

/*实现思路:

1.将首元素暂存于x,则首元素的位置视为空,接下来逐个移位填空。

移位时,R[i]为目前的空位元素,R[m]为待移动到空位的元素。

当目标元素地址=首地址时,则移位完成。

2.考虑到p可能是n的因数,因此要通过移动次数j判断是否已移动n个元素;

若要移动多轮,则每一轮的移动首元素应+1,

因此,t表示共移动了几轮,R[t]表示本轮移动的首元素

*/

/*时间复杂度:O(n);空间复杂度:O(1) */

/*for循环的参数:

int j=0; //计数 共移动了几个元素

int t=0; //计数 共移动了几轮,R[t]表示本轮移动的首元素

j++; //每移动一次,则j+1

t++; //每移动完1轮,则t+1,t用于计算下一轮的首元素角标

*/

int i,m,x;

for(int j=0,t=0;j

i = t; //设置新一轮的首元素角标

m = i + p; //设置新一轮的目标元素角标

x = R[i]; //将本轮首元素暂存于x

for(;m!=t;j++){ //逐个将目标元素移位到空位处,当m=t,则说明本轮移动完成。

R[i] = R[m]; //将目标元素移到空位元素处

i=m; //计算新的空位元素角标

//(i+p<=n-1)?(m=i+p):(m=i+p-n); /*这句在C语言中测试成功,但换成Java就说这不是一个语句。*/

if(i+p<=n-1) //计算新的目标元素角标

m=i+p;

else

m=i+p-n;

} //移动完一轮

R[i] = x; //本轮收尾:将暂存在x的首元素移到空位元素处

}

}

public static void myprint001(int R[],int n){ //功能:打印数组

String s = "";

for (int i=0;i

s = s + R[i] + " ";

}

System.out.println(s.trim());

}

}

1009 说反话

    题目    

作者 CHEN, Yue

单位 浙江大学

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

    代码    

import java.io.*;

class Main{ //功能:将给定英文字符串按单词倒序输出

//时间复杂度 O(n) 空间复杂度O(n) n为字符串长度

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String[] arr = br.readLine().split( " ");

//输出

String s = "";

for(int i = arr.length-1;i >= 0;i--)

s = s + (arr[i]) + " ";

System.out.println(s.trim());

}

}

1010 一元多项式求导

    题目    

作者 DS课程组

单位 浙江大学

设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn−1。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

    代码    

/*

功能:多项式求导

实现思路:根据一元多项式求导法则,每两个整数为一组,假设为a b,

则求导结果为 a*b b-1 。利用循环遍历数组即可。

时间复杂度O(n) 空间复杂度O(n) n为给定字符串长度

*/

import java.io.*;

class Main{

public static void main(String[] args) throws IOException {

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String[] arrS = br.readLine().split(" +");

//数据格式转换

int[] arr = new int[arrS.length];

for(int i=0;i

arr[i] = Integer.parseInt(arrS[i]);

//计算导数

for(int i=0;i

arr[i] = arr[i] * arr[i+1]; //计算新的系数

arr[i+1]--; //计算新的指数

}

//输出结果

String s = "";

for(int i=0;i

if(arr[i]!=0) //只输出非零项

s = s + arr[i] + " " + arr[i+1] + " ";

if(s.equals("")) s = "0 0"; //处理零多项式的情况

System.out.print(s.trim());

}

}

1011 A+B 和 C

    题目    

作者 HOU, Qiming

单位 浙江大学

给定区间 [−231,231] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。

输入格式:

输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。

输出格式:

对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。

输入样例:

4

1 2 3

2 3 4

2147483647 0 2147483646

0 -2147483648 -2147483647

输出样例:

Case #1: false

Case #2: true

Case #3: true

Case #4: false

    代码    

/*

功能:判断给定的T组整数,每组A+B是否>C,并输出判断结果

实现思路:首先读取组数T,并循环处理每一组数据。

对于每一组数据,调用判断函数,直接求和。

时间复杂度O(n) 空间复杂度O(1)

*/

import java.io.*;

class Main{

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String s = br.readLine().trim();

int t = Integer.parseInt(s); //录入待读取的组数并转为int

String[] arrS = new String[3]; //用于读取每一组的String数据

int[] arr = new int[3]; //用于存储每一组的int数据

String res = ""; //用于存储一行判断结果

//循环读取输入并判断

for(int i=0;i

arrS = br.readLine().split(" +"); //读取一组数据

for(int j=0;j<=2;j++) //将String转为int

arr[j] = Integer.parseInt(arrS[j]);

res = "" + isBigger(arr[0],arr[1],arr[2]); //计算判断结果

res = "Case #" + (i+1) + ": " + res + "\n"; //生成输出信息

System.out.print(res); //打印输出

}

}

private static boolean isBigger(int a,int b,int c){

//功能:给定三个int,判断是否 A+B>C

//对于A+B可能超出int范围的情况,单独判断

if(a>c && b>0) return true;

if(b>c && a>0) return true;

if(a

if(b

//判断剩下的情况

if(a+b-c>0) return true;

else return false;

}

}

1012 数字分类

    题目    

作者 CHEN, Yue

单位 浙江大学

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:

A1​ = 能被 5 整除的数字中所有偶数的和;A2​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1​−n2​+n3​−n4​⋯;A3​ = 被 5 除后余 2 的数字的个数;A4​ = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;A5​ = 被 5 除后余 4 的数字中最大数字。

输入格式:

每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。

输出格式:

对给定的 N 个正整数,按题目要求计算 A1​~A5​ 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若分类之后某一类不存在数字,则在相应位置输出 N。

输入样例 1:

13 1 2 3 4 5 6 7 8 9 10 20 16 18

输出样例 1:

30 11 2 9.7 9

输入样例 2:

8 1 2 4 5 6 7 9 16

输出样例 2:

N 11 2 N 9

    代码    

/*

功能:对输入的一组正整数,计算五项数据并输出结果。

实现思路:采用在线处理的方式,即读取一个数字就更新一次A1-A5。

计算A1-A5时要注意,该分类若没有数字,最后要输出N 。

时间复杂度O(n) 空间复杂度O(1)

*/

import java.io.*;

class Main{

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String[] s = br.readLine().trim().split(" +");

//数据格式转换

int num = Integer.parseInt(s[0]); //正整数的个数

int n[] = new int[num];

for(int i=0;i

n[i] = Integer.parseInt(s[i+1]);

//初始化

int a1 = 0; //能被5整除的数字中所有偶数的和 ∵正整数,∴若最后为0,则说明没有这样的数字

int a21 = 0; //被5整除后余1的数字个数

int a22 = 0; //被5整除后余1的数字的交叉求和

int a3 = 0; //被5整除后余2的数字个数 若结果为0,则说明没有这样的数字

int a41 = 0; //被5整除后余3的数字个数 若结果为0,则说明没有这样的数字

double a42 = 0; //被5整除后余3的数字求和

double a43 = 0; //被5整除后余3的数字的平均数

int a5 = 0; //被5整除后余4的数字中最大的数字 若结果为0,则说明没有这样的数字

//在线处理

int t; //辅助

for(int i=0;i

t = n[i];

switch(t%5) {

case 0:

if(t%10==0) a1 = a1 + t;

break;

case 1:

a21++;

if(a21%2==1) a22 = a22 + t;

else a22 = a22 - t;

break;

case 2:

a3++;

break;

case 3:

a41++;

a42 = a42 + t;

a43 = a42 / a41;

break;

case 4:

if(t>a5) a5 = t;

break;

}//switch

}//for

//输出结果

String str = "";

if(a1==0) str = str + "N ";

else str = str + a1 + " ";

if(a21==0) str = str + "N ";

else str = str + a22 + " ";

if(a3==0) str = str + "N ";

else str = str + a3 + " ";

if(a41==0) str = str + "N ";

else str = str + String.format("%.1f",a43) + " ";

if(a5==0) str = str + "N";

else str = str + a5;

System.out.print(str);

}

}

1013 数素数

    题目    

作者 CHEN, Yue

单位 浙江大学

令 Pi​ 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 PM​ 到 PN​ 的所有素数。

输入格式:

输入在一行中给出 M 和 N,其间以空格分隔。

输出格式:

输出从 PM​ 到 PN​ 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

输入样例:

5 27

输出样例:

11 13 17 19 23 29 31 37 41 43

47 53 59 61 67 71 73 79 83 89

97 101 103

    代码    

/*

功能:给定两个整数M N,输出第M个素数到第N个素数之间的所有素数。

实现思路:从2开始计算素数,并计数,到达M时开始输出,到达N时停止。

*/

import java.io.*;

class Main{

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String[] arr = br.readLine().trim().split(" +");

int m = Integer.parseInt(arr[0]);

int n = Integer.parseInt(arr[1]);

//开始计算

int t=0; //当前行输出了几个数字

String s = ""; //存储待输出的当前行

int j = 0; //计数,共出现了几个质数

for(int i=2;j

if(ifsushu(i)){

j++;

if(j>=m){ //当前质数要输出

s = s + i + " ";

t++;

if(t==10){ //每十个数要换行

System.out.println(s.trim());

s = "";

t = 0;

}

}

}

}

if(!s.equals("")) System.out.println(s.trim());

}

//判断一个整数是否是素数 时间复杂度为O(√n)

private static boolean ifsushu(int t){

//判断特殊值

if(t==2 || t==3 || t==5) return true;

//若尾数不是1 3 7 9 则一定不是素数(10以上的数)

if(t%2==0 || t%5==0) return false;

//若此数不是6n+1或者6n-1,则一定不是素数(10以上的数)

if((t+1)%6!=0 && (t-1)%6!=0) return false;

//遍历检查(合数一定能分解为质数的乘积)

for(int i=1;Math.pow(6*i-1,2)<=t;i++)

if(t % (6*i-1) == 0 || t % (6*i+1) == 0)

return false;

return true;

}

}

1014 福尔摩斯的约会

    题目    

作者 CHEN, Yue

单位 浙江大学

大侦探福尔摩斯接到一张奇怪的字条:

我们约会吧!

3485djDkxh4hhGE

2984akDfkkkkggEdsb

s&hgsfdk

d&Hyscvnm

大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。

输入格式:

输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。

输出格式:

在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。

输入样例:

3485djDkxh4hhGE

2984akDfkkkkggEdsb

s&hgsfdk

d&Hyscvnm

输出样例:

THU 14:04

    代码    

/*

功能:根据给定的两个字符串中相同的字符及其出现的位置,输出结果。

使用 s.charAt(n) 来确定字符串s 在n位置的字符。

时间复杂度O(n) 空间复杂度O(n)

*/

import java.io.*;

class Main{

public static void main(String[] args) throws IOException{

//接收输入

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String s1 = br.readLine().trim();

String s2 = br.readLine().trim();

String s3 = br.readLine().trim();

String s4 = br.readLine().trim();

//开始计算

String s = ""; //输出结果

char c = ' '; //辅助

int t = 0; //辅助

for(int i=t;i

c = s1.charAt(i);

if(c>='A' && c<='G') //如果s1的当前字符是英文大写字母中的前七个

if(c == s2.charAt(i)){ //如果s1当前字符与s2当前字符相等

s = "MONTUEWEDTHUFRISATSUN".substring((c-'A')*3,(c-'A')*3+3); //生成解码结果

t = i; //记住当前对比到第几个元素了

break; //解码完毕,退出for循环

}

}//for

for(int i=t+1;i

c = s1.charAt(i);

if((c>='0' && c<='9') || (c>='A' && c<='N')) //如果当前字符是0-9或A-N

if(c == s2.charAt(i)){ //如果s1当前字符与s2当前字符相等

if(c<='9') //生成解码结果

s = s + " 0" + (c-'0');

else

s = s + " " + (c-'A'+10);

break; //解码完毕,退出for循环

}

}//for

for(int i=0;i

c = s3.charAt(i);

if((c>='a' && c<='z') || (c>='A' && c<='Z')) //若当前字符为英文字母

if(c == s4.charAt(i)){ //若s3 s4当前字符相等

if(i<=9) //生成解码结果

s = s + ":0" + i;

else

s = s + ":" + i;

break; //解码完毕,退出for循环

}

}

System.out.print(s.trim());

}//void main()

}//class Main

***后续题目在其它博文中更新***

优惠劵

奶酪博士

关注

关注

1

点赞

3

收藏

觉得还不错?

一键收藏

知道了

0

评论

PTA平台 · PAT(Basic Level) Practice(中文) 题目集

本文是PTA平台上收录的PAT乙级真题的参考代码(我自己写的),共115道题,主要用Java语言完成。

复制链接

扫一扫

专栏目录

PAT (Basic Level) Practice (中文).zip

04-23

PTA上关于PAT (Basic Level) Practice (中文)部分全部题解

编程提高刷题网站

qq_26318597的博客

05-31

1802

给大家推荐几个刷题网站

牛客网:有题库,会定期举办竞赛,适用于程序员、本科ACM选手和高中信息学奥林匹克竞赛选手;

https://ac.nowcoder.com/acm/contest/vip-index?&headNav=www

LeetCode:有题库,每周都会举办周赛,被称为offer收割机,里面收录的题目大都在真实的面试中出现过;

https://leetcode-cn.com/...

参与评论

您还未登录,请先

登录

后发表或查看评论

【PTA】乙级题目

m0_72108058的博客

07-04

275

当自然数 n 依次取 1、2、3、……、N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分。)输入给出一个正整数 N(2≤N≤104)。在一行中输出题面中算式取到的不同值的个数。

输出样例:

方法二:

用set

1093 字符串A+B

给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。输入在两行中分别给出 A 和 B,均为长度不超过 106

【PTA刷题】甲级 图

abyss_miracle的博客

09-23

382

图的遍历

1034 Head of a Gang

用时:70min

大意:给了N行通信(所以最多有两千个人->也就是节点),某几个人之间会形成社交网络。让你找出社交圈。社交圈是有条件的,比如边的权值要大于某个给定的K值。此外,社交圈的人数一定要大于两人。最后输出节点权值(该节点所有的边的权值之和)作为leader。还要输出这个社群的人数。

需要注意的事情:

1.社群中形成回路要如何遍历呢? 使用遍历过后马上删除这条边的方法

2.递归调用dfs之前,要先判断该节点是否被访问过。

3.翻译str和in

[PAT- Advanced Level] 甲级题解目录(Advanced Level)

Duke

12-25

1221

PAT考试一年3次,个人认为3月份和12月份的相对于9月份的简单。如果有意想考PAT的同学可以尽早准备,去考3月份的

【PAT甲级】2022冬季-PAT甲级AK题解

wooden__heart的博客

12-06

1847

2022年冬季PAT甲级题目详解

PTA-数据结构与算法题目集.zip

12-28

PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 ...

PTA浙大版《数据结构(第2版)》题目集等.zip

最新发布

12-28

PTA浙大版《数据结构(第2版)》题目集等 PTA浙大版《数据结构(第2版)》题目集等 PTA浙大版《数据结构(第2版)》题目集等 PTA浙大版《数据结构(第2版)》题目集等 PTA浙大版《数据结构(第2版)》题目集等 PTA...

PAT (Basic Level) Practise (中文)6-20的答案

02-06

PAT (Basic Level) Practise 中文题的6-20题的答案,都是自己做的。

PTA习题:数据结构与算法题目集1

08-08

}/* 你的代码将被嵌在这里 */输入样例:51 3 4 5 2输出样例:12 5 4 3 17-1 最大子列和问题(20 分)给定K个整数组成的序列{ N​1

PTA甲级模拟第一弹:1132-1135

糕糕的博客

01-25

612

pta主要是打基础的哈,练完了考虑去刷leetcode,希望尽快练完叭~

本次模拟题目:甲级1132-1135

失分点:1133和1135

1. 1133考题

1133 Splitting A Linked List (25 分)

22/25 模拟得分

#include

using namespace std;

//负数 0-k 其他

const int maxn=1000000;

struct Node{

int addr;

int value;

int.

PAT甲级题目目录

Dexter

09-08

363

按照一定的规律分类,题目是从新到旧,斜体的是超纲的或不常考部分。

字符串处理(输出控制):

1112Stucked Keyboard(20分)【将键盘坏损的地方修复】

1108Finding Average(20分)【读入有效的数字并处理输出无效的数字】

1100Mars Numbers(20分)【打表,字符与数组互转】

1035Password(20分)【对应的...

PTA|程序设计类实验辅助教学平台:基础编程题目集:编程题7-5

热门推荐

CPCCY的博客

03-16

5万+

表格输出

本题要求编写程序,按照规定格式输出表格。

输入格式:

本题目没有输入。

输出格式:

要求严格按照给出的格式输出下列表格:

Province Area(km2) Pop.(10K)

Anhui 139600.00 6461.00

Beijing 16410.54 1180.70

Chongqing 82400.00 31...

《PAT Basic Level习题集》题解索引(已完成)

thexiaosi的博客

09-08

276

如题

PAT乙级(Basic)题库---1003

濠well的博客

07-11

386

题目1003-我要通过解题思路这道题主要是读懂题意,根据第一第二两个条件可得字符串如果中间为“PAT”,则字符串关于“PAT”对称,再由第三个条件可得初始情况为中间字符串为“PAT”,a=c为空字符串,或者是仅由字母 A 组成的字符串。推导可得字符‘P’前的字符‘A’个数与字符‘P’和‘T’间的字符‘A’个数相乘等于字符‘T’后的字符‘A’个数。即

正确情况=A(x)PA(y)TA(z) x,y,

PAT乙级(Basic)题库---1012

濠well的博客

07-21

643

题目

1012-数字分类

解题思路

开始根据switch结构给五类正整数分类,使用不同的变量记录根据不同分类下执行的响应结果,其中A4需要求精确到小数点后1位的平均数,因此使用double类型来初始化。由于其中两类的操作需要记录该类正整数的个数,我们可以使用额外的变量辅助记录。在这里我使用了a2num记录A2类型数个数,判断进行加法还是减法操作,同时用来判断是否存在A2类型数。使用a2num...

PAT乙级(Basic)题库---1018

濠well的博客

06-24

315

题目

1018-锤子剪刀布

解题思路

在读入每局甲乙的手势的时候判断胜负关系和取胜的手势,后续进行比较即可。在这里我构建了一个结构来表示某人的各手势胜的次数及总胜利次数,最后通过一个函数计算输出胜次数最多的手势。

注意:如果在胜的次数相同的情况下,优先级:布>锤子>剪刀。即低优先级的手势只有在胜的次数多时才输出。

代码

#include

#include...

PAT乙级(Basic)题库---1015

濠well的博客

09-18

278

题目

1015-德才论

解题思路

输入时即将未录取考生舍弃,再将录取的考生进行分类,即题目说明的四类,并以此为最优先的排序规则。在类别相同时总分为优先的排序规则,总分相同时以德分为优先的排序规则,最后以考生准考证号为排序规则。在了解排序规则的优先级后我们可以自定义考生的结构并依排序规则排序,调用sort函数进行排序得到结果输出即可。

代码

#include<iostream>

#inc...

终于刷完PAT乙级练习题

柯森锎的博客

07-12

1万+

今天终于刷完了PAT乙级练习题,从6月14号开始,本来计划一天两道题,开始时进度缓慢,一道题要好久,后面慢慢速度就上来了,最后20道拿来模拟计时训练,四次模拟总算是有提高。

晒一下排名,哈哈

木可堂主就是我啦。

还有就是要感谢@luoluo,题目做不出来了总是参考他的。

后面开始继续刷甲级的题目,报了9月10号的秋季PAT甲级考试,希望能来得及好好练习,考个满意的成绩吧,加油!!!

pta数据结构与算法题目集(中文) 词频统计

11-28

pta数据结构与算法题目集是一个涵盖了各种数据结构和算法题目的平台,旨在帮助学习者提高编程能力。其中,词频统计是一种常见的算法题目,在处理文本数据时非常有用。 词频统计可以通过哈希表来实现,首先将文本中...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

奶酪博士

CSDN认证博客专家

CSDN认证企业博客

码龄1年

暂无认证

54

原创

102万+

周排名

2万+

总排名

14万+

访问

等级

963

积分

144

粉丝

347

获赞

102

评论

1334

收藏

私信

关注

热门文章

如何在 VS Code 中编写、运行C语言程序 教程

52862

汇编语言工具(DosBox、debug)下载与安装教程

12787

《汇编语言》王爽(第四版)第八章 实验7

9525

汇编语言 VSCode编辑器的下载、安装与配置使用

6763

《汇编语言》王爽(第四版) 课程设计1

5882

分类专栏

C语言程序设计

1篇

数据结构与算法

4篇

汇编语言

23篇

计算机组成原理

2篇

Java

14篇

计算机科学

9篇

VS Code 使用方法

2篇

最新评论

如何在 VS Code 中编写、运行C语言程序 教程

m0_73914419:

可以看看目录中有没有中文,我之前有中文就找不到,换个路径就找到了

用8086汇编语言写新春祝福

奶酪博士:

追随所爱,创造美好。2024.02

《汇编语言》王爽(第四版) 第十二章 实验12

奶酪博士:

是的,保存用户程序的断点(CS:IP)以及将之更改为中断处理程序的入口地址,这是硬件自动完成的。

《汇编语言》王爽(第四版) 第十二章 实验12

三月樱:

是自动赋值给cs:ip吗?

《汇编语言》王爽(第四版) 第十二章 实验12

奶酪博士:

执行到这里时CS的值就是0000H了。这是因为,在用户程序执行时触发了0号中断(测试程序中写的那句 div bl触发的),系统要进行中断处理,就会自动保存当前断点(CS与IP的值),之后就去中断向量表找到0号中断处理程序的入口地址(在第2步中设置为 0:200H),把这个地址值赋给CS:IP,也就是接下来要从0号中断处理程序的入口地址开始执行。待中断处理程序执行完毕,系统会自动返回到用户程序的断点处继续执行。

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

用8086汇编语言写新春祝福

【C语言】浙大版C语言程序设计(第三版) 练习7-4 找出不是两个数组共有的元素

【Java】PAT Basic Level 1024 科学计数法

2024年2篇

2023年13篇

2022年39篇

目录

目录

分类专栏

C语言程序设计

1篇

数据结构与算法

4篇

汇编语言

23篇

计算机组成原理

2篇

Java

14篇

计算机科学

9篇

VS Code 使用方法

2篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

PAT/PTA Team Blog

PAT/PTA Team Blog

PAT/PTA Team Blog

首页

归档

记一次评测机性能调优

发表于

2018-11-15

0x00 起因首先,这是一篇迟到了非常久的 blog,这个性能优化早在今年 6 月份就已经上线,这篇文章将细致的梳理一下这次调优的过程。

调优的对象就是 PTA 使用的评测机,该代码已经开源,原本是 quark 学长维护的版本,而现在在我们团队的 git 仓库当中,分别是 ljudge 和 lrun 。

首先简单讲一下评测机的部署方案:

每个评测机处于一个 docker 容器当中

每台云主机可以 host 多个 docker 容器

每个评测机都是单线程工作的,占用一个核心

每台云主机根据自身核心数来决定最大承担 judger 容器的个数

judger 的性能问题,是在一次承担考试的时候发现的。我因为观察到评测队列堆积,所以进行了一次扩容,将云主机上的容器个数调整到了最大值。但不幸的是,从监控来看,评测队列的消化速度几乎没有增加。之后也遇到过几次同样的情况,所以最终决定进行一次性能问题的排查。

0x01 排查准备一些脚本:

entrypoint.sh

1234567#!/bin/bashcd /app/ljudge/examples/a-plus-bfor ((i=1;i<=100;i++));do ljudge -u a.c -i 1.in -o 1.out -i 2.in -o 2.out 2>/dev/null >/dev/nulldone

在容器当中 judge 一个最简单的 a+b 的程序,循环 100 次,放进容器当中备用

123456789101112131415161718192021#!/bin/bashCMD='docker run --rm --privileged --entrypoint=/app/ljudge/examples/a-plus-b/entrypoint.sh --cpus=1 pintia/ljudge-docker:benchmark'echo '1 container'time bash -c "${CMD}"echo '2 container'time bash -c "${CMD} & ${CMD}"echo '3 container'time bash -c "${CMD} & ${CMD} & ${CMD}"echo '4 container'time bash -c "${CMD} & ${CMD} & ${CMD} & ${CMD}"echo '5 container'time bash -c "${CMD} & ${CMD} & ${CMD} & ${CMD} & ${CMD}"echo '6 container'time bash -c "${CMD} & ${CMD} & ${CMD} & ${CMD} & ${CMD} & ${CMD}"

分别启动 1 ~ 6 个容器,这里的 --entrypoint 就是指定刚才放进容器当中的脚本,测试所需要的时间(脚本写的有点 low 见谅)

在一台 8 核心的机器上,得到了测试结果

1234567891011121314151617181920212223242526272829301 containerreal 0m39.932suser 0m0.020ssys 0m0.012s2 containerreal 0m56.090suser 0m0.032ssys 0m0.008s3 containerreal 1m11.888suser 0m0.016ssys 0m0.004s4 containerreal 1m30.698suser 0m0.060ssys 0m0.020s5 containerreal 1m47.885suser 0m0.028ssys 0m0.012s6 containerreal 2m2.968suser 0m0.048ssys 0m0.024s

很明显可以看出,在一台核心数足够的机器上启用多个 judger,消耗的时间竟然是线性增加的,也就是说,在单机上通过增加 judger 实例数进行的扩容效果几乎没有,多个 judger 之间势必有资源发生了抢占。

0x02 继续排查那确认了这种部署模式的问题之后,接下去就需要找是什么东西在多个 judger 之间发生了竞争。排查持续了一天,期间使用了各种工具比如 perf,strace 等等,但都没有确定问题所在。但一个偶然的尝试发现了一些问题。

通过观察,可以发现 lrun 进程频繁的 sleep 在 copy_net_ns 这个地方。确认了一下代码,每一次评测都会创建一个新的 network namespace。所以根据表现,大胆猜测 network namespace creation 应该是一个比较耗时而且无法并发的调用。但 judger 确实需要进行网络隔离,所以在这里我尝试绕过这个行为。

因为 judger 同一个时间只会评测一个程序,也就是说同一个时间至多只会存在一个沙盒,所以我可以事先创建好一个已经被隔离开的 network namespace,而让每次评测是将这个 network namespace 设置到当前沙盒上,且不需要考虑多个沙盒的情况。

带着这个思路简单增加了一些代码:

123456789101112131415161718192021222324252627282930// switch to existed netns for better performance if neededif ((clone_flags & CLONE_NEWNET) == CLONE_NEWNET && arg.reuse_netns) { INFO("try to reuse network namespace"); int netns_fd = open(netns::LRUN_NETNS_PATH, O_RDONLY); if (netns_fd < 0) { // create reusable net ns INFO("create reusable network namespace") int result = system(netns::LRUN_NETNS_CMD); if (result != 0) { ERROR("can not create network namespace"); return -3; } else { netns_fd = open(netns::LRUN_NETNS_PATH, O_RDONLY); if (netns_fd < 0) { ERROR("can not open reusable network namespace"); return -3; } } } INFO("set network ns to %s", netns::LRUN_NETNS_PATH); // older glibc does not have setns if (syscall(SYS_setns, netns_fd, CLONE_NEWNET)) { ERROR("can not set network namespace"); return -3; }; close(netns_fd); clone_flags ^= CLONE_NEWNET;}

如果没有 reusable network namespace,则创建一个新的,如果有并且可用,就将当前沙盒的 network namespace 设置成它。

0x03 验证准备脚本:

entrypoint-netns.sh

1234567#!/bin/bashcd /app/ljudge/examples/a-plus-bfor ((i=1;i<=100;i++));do ljudge --reuse-netns -u a.c -i 1.in -o 1.out -i 2.in -o 2.out 2>/dev/null >/dev/nulldone

在之前的测试脚本当中加入测试优化过的 judger 的代码

12345678910111213141516171819202122232425262728293031323334353637383940#!/bin/bashCMD='docker run --rm --privileged --entrypoint=/app/ljudge/examples/a-plus-b/entrypoint.sh --cpus=1 pintia/ljudge-docker:benchmark'echo 'No reuse netns, 1 container'time bash -c "${CMD}"echo 'No reuse netns, 2 container'time bash -c "${CMD} & ${CMD}"echo 'No reuse netns, 3 container'time bash -c "${CMD} & ${CMD} & ${CMD}"echo 'No reuse netns, 4 container'time bash -c "${CMD} & ${CMD} & ${CMD} & ${CMD}"echo 'No reuse netns, 5 container'time bash -c "${CMD} & ${CMD} & ${CMD} & ${CMD} & ${CMD}"echo 'No reuse netns, 6 container'time bash -c "${CMD} & ${CMD} & ${CMD} & ${CMD} & ${CMD} & ${CMD}"CMD_NETNS='docker run --rm --privileged --entrypoint=/app/ljudge/examples/a-plus-b/entrypoint-netns.sh --cpus=1 pintia/ljudge-docker:benchmark'echo 'Reuse netns, 1 container'time bash -c "${CMD_NETNS}"echo 'Reuse netns, 2 container'time bash -c "${CMD_NETNS} & ${CMD_NETNS}"echo 'Reuse netns, 3 container'time bash -c "${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS}"echo 'Reuse netns, 4 container'time bash -c "${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS}"echo 'Reuse netns, 5 container'time bash -c "${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS}"echo 'Reuse netns, 6 container'time bash -c "${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS} & ${CMD_NETNS}"

对照测试!得到结果

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960root@judger-test:~# bash benchmark.sh No reuse netns, 1 containerreal 0m40.134suser 0m0.044ssys 0m0.020sNo reuse netns, 2 containerreal 0m56.876suser 0m0.068ssys 0m0.044sNo reuse netns, 3 containerreal 1m13.356suser 0m0.032ssys 0m0.020sNo reuse netns, 4 containerreal 1m28.670suser 0m0.072ssys 0m0.040sNo reuse netns, 5 containerreal 1m44.280suser 0m0.104ssys 0m0.068sNo reuse netns, 6 containerreal 2m2.403suser 0m0.104ssys 0m0.072sReuse netns, 1 containerreal 0m20.290suser 0m0.040ssys 0m0.016sReuse netns, 2 containerreal 0m20.003suser 0m0.076ssys 0m0.036sReuse netns, 3 containerreal 0m20.299suser 0m0.100ssys 0m0.060sReuse netns, 4 containerreal 0m20.947suser 0m0.088ssys 0m0.068sReuse netns, 5 containerreal 0m21.493suser 0m0.032ssys 0m0.020sReuse netns, 6 containerreal 0m23.164suser 0m0.108ssys 0m0.056s

可以看到优化之后,在同一台机器上开核心数以内的 judger 实例,总时长并不会有明显增加,也就是说扩容的目标达到了。

至此这次 judger 的性能优化就算是完成了~

主观题学生互评题目集

发表于

2018-09-10

背景目前在 PTA 中主观题作为单独的一类题目,学生作答后需要老师自行批改,给出分数与可选的评语,并进入题目集的排名列表中。

互评题目集互评题目集是近日来新加入的功能,参与作业的学生可以在提交作业后,由系统自动分配互评任务,评价打分后自动计算分数,并自动将需要仲裁的作业提醒老师进行仲裁。

创建互评题目集

互评题目集将会是一个全新的题目集类型,此类型只能加入一道主观题。

作业截止时间

系统将在作业截止时间自动进行互评任务分发,之后学生需要进入系统对每个任务进行匿名互评。

互评截止时间

到达互评截止时间后,系统会根据互评结果计算每份作业的分数。根据互评结果与老师的设置,系统会自动将分数偏差过大、分数过高或过低、评分人数不足等各种有异常的作业单独标注,等待教师仲裁。

反馈

启用反馈后,被评分的学生可以对每一个评价进行 1-5 的打分,反馈结果将影响评分者的评分权重。

申诉

启用申诉后,学生可以在系统中向申诉本次作业并填写理由,此份作业将单独列出,教师可以选择回复申诉,或再次进行仲裁修改分数。

评分规则

教师可以配置是否允许未提交作业的学生参与互评。

“用户组中所有用户参与互评,互评成绩单独计算”

在此规则下教师需要为互评独立设置分数,学生即使未提交作业,如果完成互评也可以获得相应的分数。

”只有提交了作业的人参与互评,惩罚分从作业得分中扣除“

在此规则下,未提交作业的学生无法参与互评,即在本题目集无法得到任何分数。此时互评完成不佳的学生(未完成或给分偏差过大导致扣分)将直接从作业中扣除分数。

每组互评份数

每份作业需要被几位学生评价。当评价人数不足时(学生数量不足或提交了互评的人数不足),作业会被单独标注并等待教师仲裁。

未完成互评惩罚

每一份未完成的互评任务扣分分数。

仲裁阈值

分数差:每份作业得到的互评分数差距超过满分的百分之多少后,会自动提示教师进行仲裁。同时超过分数差的给分将会导致互评学生扣分。具体规则将在后续介绍。

得分上限(下限):某份作业的计算后成绩超过了上限(或低于下限)后,会提示教师进行仲裁人工确认分数。

添加用户组

互评任务将在同一个用户组中进行分配,教师可以添加多个用户组,各个用户组在互评中互相独立,任务不会跨越用户组分配。

为了减少学生可能猜出互评的是哪位学生的作业,建议在添加用户组时不要勾选“查看全体提交列表”权限。

添加题目互评题目集只能添加一道主观题,加入题目集后教师可以为这道题目设置分数。

题目分数将会展示在学生做作业,进行互评等界面。

学生提交作业到达题目集开始时间后,学生可以在题目集中完成作业,在到达作业截止时间前,可以继续修改自己的作业,最终互评时以最后一次提交为准。

学生进行互评作业截止时间后,系统会自动分配互评任务。学生不会分配到自己的作业。

学生将会看到需要进行评价的匿名作业,对每份作业都可以打分并写评语。

教师仲裁到达互评截止时间后,系统会根据学生的评价结果自动计算各项分数,同时将需要仲裁的作业单独列出。

教师可以进入互评结果页面,查看每位学生的互评情况,并仲裁分数。

如果启用了申诉功能,学生可以向老师发送一份申诉,教师可以选择回复申诉,并根据学生的申诉情况进行仲裁。

一个例子互评配置

在本例中,我们设置了开启反馈与申诉,评分规则为只有提交了作业的学生才可以参与互评。每份作业需要被两位学生评价,如果学生没有提交评价,每份作业会被扣 5 分。

我们授权了一个用户组参与互评,一共 5 位学生,分别为 学生 1-5。

我们设置了这道题为 30 分,根据前面的仲裁阈值设置,当两位评价的分数差距超过 6 分(30 分的 20%),计算后得分超过 25.5 分或低于 18 分后,会自动提示老师需要进行仲裁。

学生提交作业前四位学生都提交了作业,而第五位学生没有提交。(为了演示方便我们让每位学生将自己的编号作为答案提交,实际作业中学生不应该提交任何能被识别出自己身份的作业内容)

在提交列表中,教师可以看到每位学生的各此提交情况。某位学生提交了多次,在这里也会全部列出。

学生进行互评提交作业阶段结束后,系统会自动对作业进行分发,学生在互评任务界面可以匿名的看到自己需要评价的作业。

点击批改会看到作业的答案,学生可以在这里填写分数与评语,同时还可以申报违规。一旦某份作业被学生申报违规,教师会被提醒对这份作业进行仲裁。

互评截止之前,学生可以多次修改互评的结果,评价结果也会显示在列表中。

互评结束互评阶段结束后,学生和教师可以分别查看自己的和全部的互评情况。

学生查看互评结果与申诉学生能够查看自己的作业互评得分,给别人互评的得分或扣分,以及所有给自己的评价(包括分数及评语)。

学生一共收到了两份互评,得分分别为 25 和 20, 分数差为 5 分,不需要仲裁。

教师仲裁与调整互评阶段结束后,教师可以在互评结果页面看到所有学生的互评情况。其中需要仲裁或未提交的学生会列在最前面,此时没有问题的成绩将会进入提交列表和排名。

仲裁违规点击进入第一位需要仲裁的学生,会列出得分情况以及等待仲裁的原因,教师可以查看作业后进行仲裁。

这份作业有学生报告违规(违规原因可以在下方查看),并且分数低于仲裁得分下限。

下方的详细列表中会列出这位学生所有给出的互评与收到的互评,包括评语以及汇报违规后的理由,教师可以参考这些信息对作业进行仲裁。

假设教师认为这位学生的确违规,可以仲裁时选中“违规”,并且把分数设置为 0 分,此时学生本次作业就会不得分,并且由于 0 分,另一位进行仲裁的学生会被扣除 15 (学生的给分) - 30 (满分) * 20% (仲裁阈值) / 2 分。即 12 分:

可以看到这位学生原本作业得分 27.5, 但由于仲裁导致超阈值扣分 12 分,最终四舍五入得分为 16 分。

此时教师认为对这位学生的互评扣分过多了,只是未发现违规,希望调整他的分数。可以点击右上角的调整按钮,直接调整他的最终得分。

此时我们直接调整了他的总分为 22 分,可以看到虽然各部分得分还在,但最终成绩尊重了教师的调整结果。

学生的申诉与反馈功能都比较简单,学生可以直接进行操作,教师会获得申诉的提示,因此再次不演示。

FAQ仲裁与调整

仲裁修改的是学生的作业得分(不包括互评相关分数),仲裁后的成绩仍然要减去这位学生的互评扣分,才是最终得分。同时仲裁将会导致其他为这位学生打分的学生重新计算互评罚扣。

调分直接修改学生的最终得分,不会影响他收到的互评。

仲裁与调整操作互相覆盖,后操作的会覆盖掉之前的操作。

评分规则

用户组中所有用户参与互评,互评成绩单独计算

未提交作业的学生也可以参与互评(会被系统分发任务)

题目集满分:作业分数(题目的分数) + 互评满分

学生互评最多罚扣到互评满分

只有提交了作业的人参与互评,惩罚分从作业得分中扣除

未提交作业的学生不可以参与互评(系统不分发任务)

题目集满分:作业分数

学生互评不设置最多罚扣分数(互评完成的不好,最多可能将整个题目集扣至 0 分)

作业分发范围如果题目集中被授权了多个用户组,作业只会在当前用户组中分发(也就是说不同用户组不会互相互评作业)

分组作业如果互评作业需要分组完成,老师可以将所有组长单独加到一个用户组中,授予答题权限(提交答案),所有作业都由组长分给同学完成,再由组长提交作业、进行互评。

注:

互评功能还在早期阶段,由于流程复杂,可能还有 bug。如果遇到成绩计算错误,作业没有分发等问题,请直接在群中联系我们(学生提交的作业都会保留)。

目前导出功能还未为互评题目集进行优化,后续我们将专门为互评设计导出功能。

互评题目集在作业分发、计算分数等多个阶段都需要用户组与题目集的授权关系,建议老师轻易不要删除。

PTA题目集公告升级与登录功能升级

发表于

2018-08-31

新的学期即将到来,为了能更好地服务拼题A 各位用户,我们进行了如下升级,希望大家拼题愉快:

新功能

markdown编辑器升级,支持上传pdf/word/xls/ppt文件

题目集公告现在支持markdown了

新设计的登录页面

小改动

题目集测试数据文件限制由20MB提升至80MB

部分编译器版本升级

自测图标调整

功能说明markdown编辑器文件上传在题目编辑页和题目集公告页的编辑器中,点击工具栏内文件图标,即可上传文件,目前支持pdf/word/xls/ppt四种类型文件的上传。

题目集公告题目集编辑页的公告现在也支持markdown了,各位老师可在公告中发布课程相关文件,便于学生第一时间看到公告。

新登录页我们为企业用户和我们的网站设置了全新的登录页面,在企业用户的专属域名下,登录页将显示企业logo与企业名称,企业HR与应聘者可在此登录进入企业版。

我们旗下4款产品均可使用统一登录页面登录

OMS 监考系统白名单、代理服务器及其他新功能

发表于

2018-08-27

OMS 监考系统在暑假期间进行了较大幅度的升级,下文将介绍对用户影响较大的更新。

更友好的客户端提示目前客户端中部分错误提示对用户不够友好,我们对一些常见的错误补充了说明内容,方便用户进行排查以及处理。

支持代理服务器为了响应部分学校的特殊情况,目前系统架构进行了重写,使得客户端已经可以通过代理服务器访问 PTA 相关系统了。

代理服务器的具体要求是:

为 HTTP 代理,且支持 HTTPS 穿透;

不修改数据包内容。

使用方式是在客户端目录下的

1oms-client-startup.exe.config

以及

1bin/oms-client.exe.config

两个文件中的

1

的 value 后填入您需要的代理服务器。一个例子如下:

1

期望该功能能为各学校提供更多便利。

白名单每个学校的环境不一致,在监考时可能会出现误报的情况。我们本次增加了关键词白名单,老师可以根据自身情况添加白名单。目前该功能仍在测试中。

结束后自动关闭客户端现在考试结束后客户端会自动关闭,以减少机房老师工作量。因此如有考试延时等问题,请务必修改考试配置(修改时因为需要重新载入配置,客户端可能会出现消失再出现的情况,请让学生不要惊慌)。我们也推荐老师在使用时预留额外时间。

附言目前客户端版本为 V0.11.0,根据升级后反馈还可能进行一次到数次的升级,如果有问题欢迎反馈给我们,也欢迎还没有购买系统的学校联系我们了解详情~

ACM/ICPC 计分方式

发表于

2018-08-02

ACM 国际大学生程序设计竞赛(英语: ACM International Collegiate Programming Contest, ICPC )是由美国电脑协会( ACM )主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。经过 30 多年的发展,ACM 国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛。

近年来 ACM/ICPC 在中国国内迅速发展,越来越多的大学建立了 ACM/ICPC 的培训体系,专门培养和训练学生并组建队伍参加比赛。因此 PTA 加入了 ACM/ICPC 的计分方式,为希望开展竞赛培训的学校提供一个网上比赛和做题的平台。

一个 ACM/ICPC 题目集一个题目集在创建的时候可以选择是否是 ACM/ICPC 题目集,创建之后不可以更改。

目前 ACM/ICPC 题目集只允许添加编程题,一般而言比赛也只含编程题。

判题和排名说明PTA 使用的规则参考了官方规则

判题ACM/ICPC 比赛中,参赛者每提交一个程序,比赛中都会实时评测,并且结果将反馈给参赛者。评测的结果可能是:

答案正确:通过了所有测试点

答案错误:第一个未通过的测试点是结果错误

运行超时:第一个未通过的测试点运行时间超出了规定时限

段错误:程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起

等等,更多错误的解释可以参考 PTA 首页公告里的 FAQ 。

排名ACM/ICPC 比赛中题目没有分数,选手按过题数量从高到低进行排名,过题数相同时按总用时从小到大进行排名。当这两个都相同时按最后过题的提交时间排名,不过目前尚未实现。

PTA 上对此规则进行了拓展,题目允许存在分数,最终排名按照分数从高到低排名。要实现标准的 ACM 比赛排名,只需要将每道题的分数设置成一样就行了。

总用时的单位为分钟,计算公式为:

总用时 = 过题时间总和 + 总罚时

其中总罚时 = 失败尝试次数 * 20 分钟

一道题的过题时间指的是从比赛开始到在此题上第一次成功的提交经过的时间。

失败尝试次数指在成功做对一道题之前的提交次数,但是不包括编译错误。

总用时也有另外一种等价的计算方法,可以先计算每道通过的题目的用时和罚时,再一起加起来。

封榜规则ACM/ICPC 比赛中,为了保留悬念,通常在比赛结束前的某个时刻进行封榜,从这时候到宣布排名结果为止,参赛者将无法在排名榜单上看到别人的提交结果,但是可以看到别人封榜后在某个题上进行了尝试。

一般而言一场比赛时长为 5 个小时,封榜时间为比赛结束前 1 小时。

排名页 UI一个可能的排名页面如下:

图中分别用红黄绿颜色进行了不同的标注:

红色加号表示通过此题,如图 1 和图 2 所示

加号下方的黑色小字表示通过此题的时间(从比赛开始进行计时),图 1 和图 2 中均表示比赛开始后 20 分钟后过题。

加号后面跟着失败的尝试次数,图 1 没有数字,说明第一次提交就通过了,图 2 加号后的 2 表示有两次失败的尝试。

绿色减号表示提交此题,但是仍然没有通过,如图 3 所示

图 3 中绿色的 -1 表示在此题上有一次失败的尝试,并且仍未通过。

绿色数字存在一种特殊情况,如图 4 所示

提交了但是结果为编译错误,由于编译错误不算失败尝试,所以结果会显示为绿色 0 。

黄色数字仅出现在封榜之后,如图 5 所示

如果在封榜后继续提交封榜前没有过的题,结果将不会显示出来,会将封榜后尝试的次数用黄色加号和数字挂在后面,比如图 5 ,表示封榜前有一次失败,封榜后又提交了两次。

注意点比赛结束后榜单不会自动刷新,需要点一下重建排名才能把封榜的效果去掉。

使用题目自测保证题目质量

发表于

2018-07-23

在 PTA 中,程序填空题、函数题和编程题是需要被评测机编译(或解释)执行的题目类型,通过对输出数据的对比,判断学生答题正确性。

平时我们在检查题目以及解答老师疑问的过程中,总结出一些容易遇到的错误:

出题老师添加的测试数据有误,学生无法得到某些评测点分数

程序填空题挖空语法错误,导致系统解析空格时出错

函数题忘记添加代码插入点,评测机无法正确评测学生答案

编程题样例输入输出错误

我们在逐步优化的过程中添加了更严格的出题语法检查,预防常见的出题错误,同时加入了在线查看测试数据功能,方便老师随时检查测试数据。

本月我们对程序填空题、函数题和编程题上线了题目自测功能。

什么是题目自测题目自测能够将出题老师的测试数据(以及编程题的样例数据)与题目标准答案一起提交到评测机执行,比对标准答案结果与实际程序输出结果,并给出测试结果。这一机制能有效保证测试数据的正确性,防止由于出题老师疏忽或系统问题导致学生做题时无法得到正确的评测结果。

通过自测意味着什么题目自测保证了这道题目能够正确被系统解析、能够在评测机中执行,同时出题老师的标准答案和测试数据相符合。

除此之外自测不能解决以下问题:

题目描述不清或有误导致学生无法理解

测试数据本身较弱,使用不完善的程序也能执行通过

引用他人通过自测的题目在题库列表以及向题目集中添加题目时,可以在状态列查看题目自测结果,同时只有通过自测的题目才可以进行发布。

出题时查看自测结果每次题目的添加和更新都会自动执行题目自测功能,老师在一般情况下无需手动执行。

在题目修改界面的右上角会显示当前题目的自测结果,并且在点击后查看更加详细的评测结果(包含运行时间、内存占用、编译提示等信息)。

编程题的样例数据是学生辅助学生正确理解题目的重要信息,为尽量避免学生由于样例数据错误对题目造成误解,除了测试数据外,编程题在进行自测时还检查了了样例数据的正确性。

UPDATE 1: 现有的已公开题目有可能未通过自测,我们将逐步提醒老师并协助进行完善,但之后所有的题目发布操作都需要已经通过自测。UPDATE 2: 目前在题目创建完成时不会自动执行自测,老师可以在右上角手动点击开始自测或再次进行更新,我们近期将会修复。

glibc 更新导致的段错误排查

发表于

2018-06-27

0x00 起因姥姥在检查 PAT 练习题的过程当中,发现一道题曾经能过的标准程序现在在两个测试点上会产生段错误。题目链接:英文版

0x01 排查拿到姥姥的标准程序,是个 C 的程序,在网站上看了看同学们的提交,几乎全是 C++,并且也没有遇到同样的问题,所以总体上讲这个情况影响可能不是特别大。

观察出现问题的测试点,发现是两个数据量最大的 case。那看样子这个问题和 case 大小相关。

尝试手跑命令重现,发现一个奇怪的现象,如果不在沙盒里运行,程序毫无问题,运行结果也没有错。

但是放进沙盒运行就直接抛段错误。

而后我们尝试在沙盒当中获得 segmentation fault 可能产生的 core dump 无果。再尝试在沙盒当中运行 gdb 进行调试,但由于 gdb 本身会使用被沙盒禁止的系统调用,所以不能进行断点调试之类的,所以这次索性将所有系统调用开放,允许程序使用。这时候神奇的事请发生了,原本段错误的程序竟然能够正常运行了。

去除系统调用限制

那问题就简单了,经过几次二分查找之后,我们确定了造成段错误的系统调用限制 sysinfo

0x02 验证我们可以验证一下不同数据集,同样的程序调用系统调用有什么区别

小数据集

大数据集

没错,在大数据集情况下,这个程序会额外调用一个 sysinfo 系统调用,而它是被沙盒禁用的,所以产生了段错误。

0x03 继续排查经过几次“print 大法好”调试之后,我们发现 sysinfo 是在 qsort(E, M, sizeof(struct edge), ComparW); 这行代码当中发生的。那 qsort 为什么需要调用 sysinfo 呢?通过搜索我们找到了一个 patch getsysstats: use sysinfo() instead of parsing /proc/meminfo

我们节选一些:

Profiling git’s test suite, Linus noted [1] that a disproportionatelylarge amount of time was spent reading /proc/meminfo. This is done bythe glibc functions get_phys_pages and get_avphys_pages, but they onlyneed the MemTotal and MemFree fields, respectively. That sameinformation can be obtained with a single syscall, sysinfo, instead ofsix: open, fstat, mmap, read, close, munmap. While sysinfo alsoprovides more than necessary, it does a lot less work than what thekernel needs to do to provide the entire /proc/meminfo. Both strace -Tand in-app microbenchmarks shows that the sysinfo() approach isroughly an order of magnitude faster.

意思是说 Linus 发现,glibc 在获取内存相关信息的时候,是直接文件读 /proc/meminfo的,而这些信息在 sysinfo 这个系统调用当中就有,而且性能要好得多,因为文件操作确实很慢。

So it seems that any application that uses qsort on a moderately sizedarray will incur this cost (once), which is obviously proportionatelymore expensive for lots of short-lived processes (such as the git testsuite).

他也提到了,当 qsort 执行在一个较大规模的数组上时,这个情况就会发生一次,这对于 git 测试集来说是非常昂贵的性能开销。

我们可以尝试抓一下这个 sysinfo 在哪里,通过 gdb catch syscall 这个方便的功能,我们抓到了调用栈

我们可以看一下源码,msort.c#164

所以当 size < 1024时,qsort 直接使用 stack。不然就会获取系统内存信息,做一些内存空间的判断,然后 malloc

0x04 后记引入这个问题,是因为大概在今年 4 月份,我们将 judger 的运行基础镜像从 ubuntu 14.04 升级到了 ubuntu 16.04。而新的 judger 代码已经上线,所以现在的 judger 已经不做 sysinfo 这个系统调用的过滤了。

PAT Tech Team

7

日志

2

标签

GitHub

© 2019

PAT Tech Team

由 Hexo 强力驱动

|

主题 — NexT.Muse v5.1.4