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

PAT 乙级题目讲解:1005 《继续(3n+1)猜想》

✅ PAT 乙级题目讲解:1005《继续(3n+1)猜想》

摘要:本题是 PAT 乙级 1005 题,延续 1001 的 (3n+1) 猜想。给定一组正整数,需要找出那些没有出现在其他数字的验证路径中的“关键数”,并按从大到小输出。解题核心在于用两个布尔数组分别记录原始输入和路径覆盖,最后求差集。常见易错点包括遗漏原始标记、排序方向错误和输出末尾多余空格。


🧩 题目简介

本题延续了 1001 题的“(3n+1)猜想”,但这次输入的是一组正整数,任务是找出这些数中“关键数”

即:没有出现在其他数字的验证路径中的数

题目要求将所有关键数按从大到小的顺序输出。


🧪 样例分析

输入:

6 3 5 6 7 8 11

逐个分析每个数字的路径:

  • 3 → 5 → 8 → 4 → 2 → 1
  • 5 → 8 → 4 → 2 → 1
  • 6 → 3 → 5 → 8 → 4 → 2 → 1
  • 7 → 11 → 17 → 26 → 13 → 20 → 10 → 5 → …
  • 8 → 4 → 2 → 1
  • 11 → 17 → …

我们发现:

  • 67的路径中包含了很多其它数字;
  • 67本身没有出现在其它数字的路径中 → 它们是关键数。

因此输出为:

7 6

🔍 解题思路

📎 关键变量说明

变量名含义
k输入的数字个数
t当前读入并处理的数字
a[]标记哪些数字是输入原始数字
f[]标记哪些数字出现在路径中
b[]存放筛选出的关键数

本题的解决流程可以分为以下几个步骤:

✅ Step 1:读入所有数字,记录原始输入

我们需要读入kkk个正整数,标记每一个原始数字a[t] = 1,方便后续判断其是否为关键数。

scanf("%d",&k);while(k--){scanf("%d",&t);a[t]=1;// 标记为原始输入

✅ Step 2:对每个输入数字执行卡拉兹猜想路径变换

  • 如果是偶数:t=t/2t = t / 2t=t/2
  • 如果是奇数:t=(3∗t+1)/2t = (3 * t + 1) / 2t=(3t+1)/2

将整个路径中经过的数字全部标记在数组f[]中:

while(t!=1){if(t%2==0)t/=2;elset=(3*t+1)/2;f[t]=1;// 出现在路径中}

✅ Step 3:筛选关键数

关键数满足:

  • 它是原始输入(a[i] == 1
  • 它没有出现在任何路径中(f[i] == 0

我们按照从大到小的顺序枚举并输出这些数:

for(inti=100;i>1;i--){if(a[i]&&!f[i]){b[++j]=i;}}

✅ Step 4:输出格式控制

注意:数字之间用空格隔开,末尾不带空格。

for(inti=1;i<=j;i++){printf("%d",b[i]);if(i<j)printf(" ");}

完整代码

#include<bits/stdc++.h>usingnamespacestd;intk,t;boolf[10005],a[105];intmain(){scanf("%d",&k);while(k--){scanf("%d",&t);a[t]=1;// 标记 t 是数列中待验证数字while(t!=1){if(t%2==0){t/=2;}else{t=(3*t+1)/2;}f[t]=1;// 标记验证路径中出现过的数字}}intb[105]={},j=0;for(inti=100;i>1;i--){if(a[i]&&!f[i]){b[++j]=i;// 找出所有关键数存到 b[1] ~ b[j]}}for(inti=1;i<=j;i++){printf("%d",b[i]);if(i<j)printf(" ");}return0;}

🚧 常见错误提醒

错误类型具体表现
输入未标记忘记a[t] = 1,无法识别原始输入
顺序错误正确顺序应为从大到小枚举(100 → 1)
输出格式错误忽略最后一个数字后不能有空格
数组越界f[t]a[t]空间开太小,导致崩溃

✅ 总结归纳

本题是集合判定与路径覆盖思想的结合实践,建议作为 1001 题的进阶练习来理解。

  • 熟练掌握 卡拉兹猜想 模拟建模;
  • 学会在路径遍历中构建覆盖集合;
  • 筛选出未被覆盖的“关键节点”;
  • 注重输出格式控制,避免低级失误。

🧠 思维拓展

本题的核心是构造一套“路径逆向验证系统”:关键数必须“独立存在,不被其他路径覆盖”。

本质是集合操作

  • 输入集合A
  • 路径覆盖集合F
  • 输出集合 =A - F
  • 设计f[]a[]两套标记数组,分别记录路径与输入集合,是处理集合差集的一种经典思路。
http://www.jsqmd.com/news/1120724/

相关文章:

  • ReactList 未来路线图:无限滚动组件的演进方向和技术趋势
  • 计算机毕业设计之基于springboot的悦尚宾馆客房管理系统
  • MySQL 8 设置允许远程连接(Windows环境)
  • delphi12 sqlserver 客户-服务简单连接设置
  • Agent Skills架构深度解析:渐进式上下文加载的3层策略
  • 【YOLOv10多模态融合改进】| TGRS 2025 HFFE分层特征融合编码器 双模态注意力加权 + 跨尺度对齐融合,强化弱小目标多模态特征互补
  • 从Q2_K到Q6_K:Qwable-9B-Claude-Fable-5-StraTA-i1-GGUF各版本性能测试报告
  • 5大硬盘清理痛点,Krokiet如何帮你一次性解决?
  • CANN/GE LLM-DataDist CacheDesc API文档
  • Apache Maven 多版本发布:管理项目构建,快速上手有门道
  • PAT 乙级题目讲解:1006《换个格式输出整数》
  • RobustBench核心功能深度解析:从模型库到排行榜的完整工作流
  • 10分钟掌握Touch WX单文件开发模式,告别传统四文件烦恼
  • UniApp相关知识点整理
  • PAT 乙级题目讲解:1017《A除以B》
  • Mermaid Live Editor:5分钟用代码画出专业图表的终极指南
  • Mermaid Live Editor:免费在线图表编辑器的终极完整指南
  • Elm-platform开发服务器详解:elm-reactor的10个实用功能
  • 空洞骑士模组管理器Scarab:终极安装配置指南
  • Leela Chess Zero源代码详解:从棋盘表示到蒙特卡洛树搜索实现
  • PAT 乙级题目讲解:1012《数字分类》
  • PTEF框架入门:从零开始建立紫队演练计划的7天指南
  • PyTorch神经网络基础与实战:从FNN到RNN
  • nwpu-cram之机器人编程:ROS基础与应用
  • DeepSeek国产大模型家族:开源、中文强、工程友好
  • MEGA_F 00000-2006-000-06 直线驱动器模块
  • ZFS-inplace-rebalancing进度监控与日志分析完全指南
  • CANN PID控制性能指标
  • SteamShutdown终极指南:让电脑在Steam下载完成后自动关闭
  • 终极Varnish Dashboard:实时监控多服务器的完整解决方案