20/07/02 第一天

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

由于阶乘运算的结果较大,在这尤其需要考虑溢出的情况,在短的运行时间内用最大的变量类型。因为,不考虑这种情况,在检测系统取极端值的时候极有可能出错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值