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——力扣
本文来自博客园,作者:EowynTang,转载请注明原文链接:https://www.cnblogs.com/tangcoder/p/15592143.html