进行了少量的算法训练,因为明天上交课程设,所以大部分时间用在了课设上面。晚上的时候开始了算法的训练。有两点比较值得注意。
在现在的大多数编译器中已经不支持直接地动态创建数组了,(但不代表不可以用指针创建)已知的有(VS2019 ,VC++6.0,VS2017,DEV-C++) 什么是动态创建数组如:
#include<iostream> using namespace std; struct people{ int ID; struct people *next; }; int main(){ int n; cin >> n; struct people per[n]; //这里是行不通的 return 0; }在很多编译器中这里只能是一个常量,而不能是变量。
在这个循环当中,按照一定的规律抽取样例,首先想到的肯定是链表,当然,为了算法的简便和快捷,在这里优先考虑单链表(双链表确实稳定,但他对于我们和计算机的工作量都远远大于单链表)。 然后确立一个标记,用于抽取样例,这可能是最简便的方法了。
第二种就要繁琐一些,但是对于计算机的压力可能会小(他是直接对内存进行操作,运行起来可能会更快),用指针指向malloc开辟的动态数组,然后创建一个不大于3的int变量用于抽取样例,对于有3表的的空间直接删除。这会让计算机“跑的”更快(不容易超出时间限制)。
在进行一个数的循环相乘的时候,不能用它本身进行标记,还需要引入另一个变量(差错时耗时8分钟,亲测):
//计算n的阶乘 int Sn; int n; int i=1; cin >> n; while(n>0){ for (; i <= n; i++) { i *= i; } Sn+=i; } //以上为错误解答 //在循环的时候还应另外引入一个temp变量,使temp*=i。由于阶乘运算的结果较大,在这尤其需要考虑溢出的情况,在短的运行时间内用最大的变量类型。因为,不考虑这种情况,在检测系统取极端值的时候极有可能出错。