01算法设计基础

算法设计基础
一、目的要求:
(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。

二、实验内容:
(1)统计数字问题(P6)
(2)字典序问题(P6)
(3)最多约数问题(P7)
(4)最大间隙问题(P8)
(5)设计算法求解Fibonacci数列的第110项的值,并统计和分析算法的时间性能。

三、实验主要流程、基本操作或核心代码、算法片段
(1)统计数字问题(P6)
问题分析和设计:
一本书的页码从自然数1开始顺序编码直到自然数n。一本书的页码从自然数1开始顺序编码直到自然数n。求的页码按照通常的习惯编排,试统计给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2…,9。
实现方法:按要求需要得到书的每一页数字n,n每次除以10并得到对7u应余数,余数对应统计数字所在数组对应位数计数+1,直到n<10,n对应统计数字+1。
程序源代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

(2)字典序问题(P6)
问题分析和设计:
算法思路1:先设置一个长度为27的数组存放26个英文字母,从下标1开始,分别表示26个字母,初始值为0,如果出现了对应字符,则元素赋值为1,同时记录被测试的字符串长度len,当len为1返回值为1的下标,len为2,先记录len为1的情况,即组合数(1,26),再分析剩下字符串,同理当len为3时,应该先把len=1和2时的所有情况相加,即组合数(1,26)和组合数(2,26)
算法思路1:先设置一个长度为27的数组存放26个英文字母,下标从0开始编制好个字母对应下标,在1位置的进制为26,位置2进制为25, 先求出最后面字母的大小,再求出前面字母的大小。利用a字母对应的ASC码为96

程序源代码:
在这里插入图片描述

(3)最多约数问题(P7)
问题分析和设计:
最多约数问题:正整数x的约数是能整除x的正整数。设a 和b 是2 个正整数,a≤b,找出a和b之间约数个数最多的数x及其最多约数个数。
枚举法:枚举区间[a, b]的所有整数,统计他们的约数个数,找出约数最多的整数。
质因子法:取出区间[a,b]内的所有整数,判断是否能被以此增长的素数整除,若能被整除则该素数进行指数增长判断是否能被整除直至素数的指数倍大于该整数,记录指数大小,若此时已得到该整数,则利用公式正整数x的质因子分解为:x=p1^N1 × p2^N2 ×……pi^Ni,则div(x)=(N1+1)(N2+1)……(Ni+1)求得约数个数,否则继续验证素数。
程序源代码:
在这里插入图片描述
(4)最大间隙问题(P8)
问题分析和设计:
解题思路:
1,比较直接的方法是先对n个数进行排序,最快时间为nlogn,然后遍历数据顺便计算每两个数据之间的间隔,该方法不是线性时间。
2,想要用线性时间解决该问题可以使用组合数学中学到的鸽巢原理,将n个数放入n-1个桶中,每个桶大小相同为(max-min)/(n-1)且有一个上界和一个下界,第i个桶的上界为第i+1个桶的下界;
由于除去最小数字和最大数字还剩下n-2个数字,因此至少有一个桶是空的,因为最小数字一定是第1个桶的下界,最大数字一定是第n-1个桶的上界;
初始状态每个桶的上下界分别为[max,min],遍历所有数字(O(n)时间),将每个数字放入到第对应的桶中,并更新桶的上下界,例如有一个4-6的桶初始界为[8,2],只有5落入该桶,则桶的上下界更新为[5,5],并设置计数器count记录每个桶中的数字个数;
然后,一次线性扫描即可得到最大间隙。
程序源代码:
在这里插入图片描述

(5)设计算法求解Fibonacci数列的第110项的值,并统计和分析算法的时间性能。
问题分析和设计:
观察数列可得,除了第一项和第二项,所有的数列的值都是前一项和前一项的前一项的加和,转换成函数也就是f(n) = f(n-1) + f(n-2)
因为斐波那契数列可以从左到右顺序的求出每一项的值,因此只需要顺序计算到n项即可,时间复杂度为O(n)的,我们可以把它看成在单链表的最后插入一个右最后一个和倒数第二个指针指向的值来决定的。
这是一个时间复杂度为O(log n)的算法。因为斐波那契数列在n大于等于三的时候严格遵守递推数列f(n) = f(n-1) + f(n-2),而对于一个二阶的递推数列来说,我们可以用矩阵乘法来表示,且状态矩阵是2阶的方阵:
程序源代码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值