20/07/02 第一天
进行了少量的算法训练,因为明天上交课程设,所以大部分时间用在了课设上面。晚上的时候开始了算法的训练。有两点比较值得注意。
1,约瑟夫循环
小问题
在现在的大多数编译器中已经不支持直接地动态创建数组了,(但不代表不可以用指针创建)已知的有(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;
}
在很多编译器中这里只能是一个常量,而不能是变量。
约瑟夫的解法
1
在这个循环当中,按照一定的规律抽取样例,首先想到的肯定是链表,当然,为了算法的简便和快捷,在这里优先考虑单链表(双链表确实稳定,但他对于我们和计算机的工作量都远远大于单链表)。
然后确立一个标记,用于抽取样例,这可能是最简便的方法了。
2
第二种就要繁琐一些,但是对于计算机的压力可能会小(他是直接对内存进行操作,运行起来可能会更快),用指针指向malloc开辟的动态数组,然后创建一个不大于3的int变量用于抽取样例,对于有3表的的空间直接删除。这会让计算机“跑的”更快(不容易超出时间限制)。
阶乘的心得
1
在进行一个数的循环相乘的时候,不能用它本身进行标记,还需要引入另一个变量(差错时耗时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。
2
由于阶乘运算的结果较大,在这尤其需要考虑溢出的情况,在短的运行时间内用最大的变量类型。因为,不考虑这种情况,在检测系统取极端值的时候极有可能出错。