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

PAT乙级 继续(3n+1)猜想(1005) c++题解(打表越界的段错误)

题目要求:

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

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

 

看完题目,第一时间想到储存关键数的方法就是在一个数组该数值对应的位置做记录,遍历时即可知道关键数,即我们俗称的打表。但在该题中,极易发生打表越界的问题,超过题目给定的100。

在一开始提交时,提示的段错误也让我意识到我踩坑了,出现了打表过程中数组越界的问题,因此进行了更改,有以下两种方式:

1.记录时,如果该数大过100,便不进行打表

2.将数组范围扩大,尝试后1k不行,1w可以

而对于题目的要求输出最后一个数后面没空格,便可采取先输出第一个数,后面进行先输出空格再输出数的方法(如果有关键数的话)

代码如下:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int main()
{
    int i,j,k=0,n,t,a[100],b[100];//b数组记录非关键数,设为100防止越界
    int print[100];

    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(i=0;i<100;i++)
    {
        b[i]=0;
    }


    for(i=0;i<n;i++)
    {
        if(b[a[i]]==1)//该数已被覆盖
            continue;

        t=a[i];
        while(t!=1)
        {
            if(t%2==0)
                t/=2;
            else if(t%2==1)
                t=(3*t+1)/2;

            if(t<=100)//即如果该a[i]经过乘3+1/2大过100后,就不打表了,因为已经超过题目要求的数字大小
            {
                b[t]=1;//b数组该数的值的位置变为1,比如如果3是非关键数,则b[3]=1,这样查找方便很多
            }

        }
    }

    for(i=0;i<n;i++)
    {
        if(b[a[i]]!=1)
        {
            print[k++]=a[i];//用print数组记录下哪些数为关键数,方便后面由大到小排序后输出
        }
    }


    for(i=0;i<k;i++)//冒泡排序
    {
        for(j=0;j<k-i-1;j++)
        {
            if(print[j]<print[j+1])//小的放最后面
            {
                t=print[j];
                print[j]=print[j+1];
                print[j+1]=t;
            }
        }
    }

    //接下来输出关键数
    if(k>0)//有至少一个关键数,才能进行输出
    {
        printf("%d",print[0]);
    }
    for(i=1;i<k;i++)//既然题目要求最后一个数字后没空格,for循环就先空格再输出数字
    {
        printf(" ");
        printf("%d",print[i]);
    }

    return 0;
}

 

PAT运行结果如图:

 

欢迎各位在评论区留言!

如果有收获的话麻烦点个赞呗,多谢!!

 

相关文章:

  • PAT乙级 素数对猜想(1007)c++实现
  • PAT乙级 说反话(1009)c++新手易懂版
  • 图的深度遍历(邻接表)SCAU c++
  • 图的广度遍历(邻接表)SCAU c++
  • 堆排序 SCAU c++
  • 归并排序(非递归)超详细解答!!
  • PAT乙级 一元多项式求导(1010)详细解答c++
  • C语言课程设计物品竞拍管理(成品版!)
  • 折半查找判定树的画法(较简单易懂!)
  • 剑指 Offer 58 - I. 翻转单词顺序c++解法
  • 2. 两数相加 -力扣c++解法
  • 7.整数反转 - 力扣(LeetCode)
  • 1523. 在区间范围内统计奇数数目 -力扣
  • 9. 回文数 -力扣(leetCode)c++解法
  • 想要学会c++的STL?这一篇文章就足够啦!
  • [数据结构]链表的实现在PHP中
  • 【RocksDB】TransactionDB源码分析
  • JavaScript设计模式与开发实践系列之策略模式
  • Java反射-动态类加载和重新加载
  • MySQL数据库运维之数据恢复
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Spring-boot 启动时碰到的错误
  • vue自定义指令实现v-tap插件
  • Xmanager 远程桌面 CentOS 7
  • Zepto.js源码学习之二
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 关于Java中分层中遇到的一些问题
  • 汉诺塔算法
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何编写一个可升级的智能合约
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 再谈express与koa的对比
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​虚拟化系列介绍(十)
  • #QT项目实战(天气预报)
  • #vue3 实现前端下载excel文件模板功能
  • (06)Hive——正则表达式
  • (7)STL算法之交换赋值
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (算法)求1到1亿间的质数或素数
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • .bashrc在哪里,alias妙用
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @取消转义
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042