PAT乙级1005——继续(3n+1)猜想

题目:

题目详情 - 1005 继续(3n+1)猜想 (25 分) (pintia.cn)

这道题真的耗了好久!终于解出来啦!

首先反思一下为什么会被卡住这么久:

1.关于算法:我还是用到了结构体,结构体有两个变量:数值和bool,bool是为了表示这个数有没有被其他数字覆盖

每进行一次操作,这里要注意的是不能改变这个数的数值,因为后续要输出这个数(如果是关键数的话),如果像先前一样改变了这个数值,那最后这些数都变成1了。所以我们要用一个新的变量来代替这个数来做变换

2.语法:基础语法太重要了!血的教训啊!!!查bug查了好久,发现是==和=搞错了!!!尤其是bool类型,是==true/==false

还有建立结构体动态数组,这次比上次熟练了一点!

3.再吐槽一下自己的基本功:冒泡排序!因为第二重循环时循环变量已经是j了,所以比较时数组的序号是j而不是i!

4.PAT的格式化输出真的很烦,第一次测试时显示格式不对,结尾不能有空格!

 

上代码:全通过测试了,满分

#include <iostream>
using namespace std;
//构造结构体 
typedef struct Number
{
    int value;  
    bool covered; 
}TestN;
int main()
{
    int n,i,j,temp,a;
    cin>>n;  //一共有n个数字 
    
    TestN *PtrN;           //构造一个结构体指针PtrN 
    PtrN=new TestN [n];    //这个指针指向一个动态数组,数组大小为n 
    
    for (i=0;i<n;i++)
    {
        cin>>PtrN[i].value;
        PtrN[i].covered=false;    //初始化:读取数值,设置它们都没有covered 
    }
    //冒泡排序算法 
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if ((PtrN[j].value)<(PtrN[j+1].value))
            {
                temp = PtrN[j].value;
                PtrN[j].value = PtrN[j+1].value;
                PtrN[j+1].value = temp;
            }
        }
    }
    for (i=0;i<n;i++)  //遍历每一个数值
    {
        if (PtrN[i].covered==false)  //没有被覆盖 
        {    
            a=PtrN[i].value;   //将a赋值这个数 
            while (a!=1)  //当这个数不是1时进行操作 
            {
                if (a%2==0)  //是偶数 
                {
                    a/=2;   //对半除
                    for (j=0;j<n;j++)
                    {
                        if (PtrN[j].value==a)   //说明被cover了 
                        {
                            PtrN[j].covered=true;
                        }
                    }
                }
                else                       //是奇数 
                {
                    a=(3*a+1)/2;
                    for (j=0;j<n;j++)
                    {
                        if (PtrN[j].value==a)
                        {
                            PtrN[j].covered=true;
                        }
                    }
                }
            }
        }
    }
    int k=0;
    for (i=0;i<n;i++)
    {
        if (PtrN[i].covered==false)
        {
            if(k==0)
            {
                cout<<PtrN[i].value;
            }
            else
            {
                cout<<" "<<PtrN[i].value;
            }
            k++;
        }
    }
    return 0;
} 

 

写完后也查了一下其他人的解法,有的没有注释我没有看懂,有的用stack我更不懂了。。。等我再学一段时间看看有没有更好的解法

 哈哈哈哈悄悄说一句,感觉做题真的会上瘾,解出来还挺有成就感的!虽然乙级不难,但是挺考验基础功的,这方面我有不足,继续努力!

 

对了,时间复杂度:因为用的是冒泡排序,所以时间复杂度比较大,不仔细算了

 

刷题目标:PAT乙级——甲级——剑指offer——力扣

posted @ 2021-11-23 10:43  EowynTang  阅读(47)  评论(0)    收藏  举报