BX110937李建辉算法设计实验一

合集下载

BX110937李建辉实验二枚举法

BX110937李建辉实验二枚举法
电子信息学院
实验报告书
课程名:算法设计与分析
题目:实验二枚举法
实验类别【设计型】
班级:BX1109
学号:37
******
1.实验目的
(1)熟悉C/C++语言的集成开发环境;
(2)通过本实验加深对枚举法的理解
2.实验要求
(1)解不等式,设n为正整数,解不等式, 。
(2)分解质因数,对给定区间[m,n]的正整数分解质因数,每一整数表示为质因数从小到大顺序的乘积形式。如果被分解的数本身是素数,则注明为素数。
for(a=b;a<=c;a++)
{d=a*a; w=d; //确保d为平方数
for(k=0;k<=9;k++) f[k]=0;
while(w>0)
{ m=w%10;f[m]++;w=w/10;}
for(t=0,k=1;k<=9;k++)
if(f[k]>1) t=1; //测试三个平方数是否有重复数字
while(1)
{ for(m=c;m<=d;m+=2)
{ for(t=0,j=3;j<=sqrt(m);j+=2)
if(m%j==0) //实施试商
{t=1;break;}
if(t==0 && m-f>n) //满足条件即行输出
{ printf("最小的%d个连续合数区间为:",n);
printf("[%ld,%ld]。\n",f+1,f+n);
if(c!=x*d || e>100) continue;

算法分析与设计实验一

算法分析与设计实验一

算法分析与设计实验一实验内容分别针对随机生成的三组整数序列(规模为1000个数、10000个数、100000个数)进行排序,排序算法使用以下五种经典的方法,分别是:冒泡排序算法,选择排序算法,插入排序算法,归并排序算法和快速排序算法。

实验目的回顾并熟悉常用的排序算法。

通过实验体会算法设计对问题求解效率所产生的深刻影响。

算法设计的基本思路选择排序在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

直接插入排序在要排序的一组数中,假设前面(n-1)[n=2]个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。

如此反复循环,直到全部排好顺序。

冒泡排序在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。

即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

归并排序算法合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。

它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个N/2个长度为2或1的有序子序列,再两两合并,如此重复,直到得到一个长度为N的有序数据序列为止,这种排序方法称为2-路合并排序。

快速排序快速排序是对冒泡排序的一种本质改进。

它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。

在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。

快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。

然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

lab1_简单算法

lab1_简单算法

lab1_简单算法实验⼀简单算法设计⼀.实验⽬的和要求1. 理解算法设计与分析的基本概念,理解解决问题的算法设计与实现过程;2. 掌握简单问题的算法设计与分析,能设计⽐较⾼效的算法;3. 熟悉C/C++语⾔等的集成开发环境,掌握简单程序设计与实现的能⼒;⼆.基本原理算法是有穷指令集合,它为某个特定类型问题提供了解决问题的运算序列。

衡量算法效率⾼低的重要标准是算法的计算复杂性,包括:算法的时间复杂性和空间复杂性。

算法的时间复杂性指算法执⾏过程中所需的时间,通常指算法中元运算的执⾏次数,其为问题规模的函数。

算法的时间复杂性分析⼀般是近似地估算问题规模充分⼤时的时间增长率,⽤O, Ω, Θ估计。

算法的空间复杂性指算法执⾏过程中所需的内存空间。

简单算法设计是培养解决简单的实际应⽤问题的算法设计和分析的实践能⼒,具备基本的程序设计与实现的能⼒。

三.该类算法设计与实现的要点算法时间复杂性通过以下⽅法来估计:(1)计算迭代(循环)次数(2)计算基本运算的频度(3)利⽤递推(递归)关系。

算法最坏情况和平均情况时间复杂性是算法时间复杂性的重要指标。

空间复杂性的分析类似于时间复杂性。

简单算法设计通过分析实际问题,构思⼏种解决问题的算法,分析算法的复杂性,从⽽寻找⽐较⾼效的算法,并实现。

四.实验内容(⼀)相等元素问题1.问题描述元素唯⼀性问题:给出⼀个整数集合,假定这些整数存储在数组A[1…n]中,确定它们中是否存在两个相等的元素。

请设计出⼀个有效算法来解决这个问题,你的算法的时间复杂性是多少?2.代码如下#include#define N 500int main(){int i,j,m,n,t,k=0;int a[N];printf("请输⼊测试的数的个数:\n");scanf("%d",&m);for(t=0;t{printf("请输⼊序列的长度:\n");scanf("%d",&n);printf("请输⼊序列的数字:\n");for(i=0;iscanf("%d",&a[i]);for(i=0;ifor(j=i+1;j{if(a[i]==a[j]){ k=1;printf("yes\n");break;}}if(k!=1) printf("no\n");}return 0;}(⼆) 整数集合分解1.问题描述设计算法把⼀个n个元素的整数集合(n为偶数)分成两个⼦集S1和S2,使得:每个新的集合中含有n/2个元素,且S1中的所有元素的和与S2中的所有元素的和的差最⼤。

《算法设计与分析》课程实验报告 (回溯法(二))

《算法设计与分析》课程实验报告 (回溯法(二))

《算法设计与分析》课程实验报告实验序号:10实验项目名称:实验十一回溯法(二)一、实验题目1.图的着色问题问题描述:给定无向连通图G和m种不同的颜色。

用这些颜色为图G的各顶点着色,每个顶点着一种颜色。

如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。

图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。

2.旅行商问题问题描述:给出一个n个顶点的带权无向图,请寻找一条从顶点1出发,遍历其余顶点一次且仅一次、最后回到顶点1的最小成本的回路——即最短Hamilton回路。

3.拔河比赛问题描述:某公司的野餐会上将举行一次拔河比赛。

他们想把参与者们尽可能分为实力相当的两支队伍。

每个人都必须在其中一只队伍里,两队的人数差距不能超过一人,且两队的队员总体重应该尽量接近。

4.批处理作业调度问题描述:给定n个作业的集合J=(J1,J2, .. Jn)。

每个作业J都有两项任务分别在两台机器上完成。

每个作业必须先由机器1处理,再由机器2处理。

作业i需要机器j的处理时间为tji(i=1,2, ..n; j=1,2)。

对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间,则所有作业在机器2上完成处理的时间和,称为该作业调度的完成时间和。

批处理作业调度问题要求,对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。

二、实验目的(1)通过练习,理解回溯法求解问题的解状态空间树与程序表达的对应关系,熟练掌握排列树、子集树的代码实现。

(2)通过练习,体会减少搜索解空间中节点的方法,体会解的状态空间树的组织及上界函数的选取对搜索的影响。

(3)通过练习,深入理解具体问题中提高回溯算法效率的方法。

(4)(选做题):在掌握回溯法的基本框架后,重点体会具体问题中解的状态空间搜索时的剪枝问题。

三、实验要求(1)每题都必须实现算法、设计测试数据、记录实验结果,并给出时间复杂度分析。

四、实验过程(算法设计思想、源码)1.图的着色问题(1)算法设计思想用邻接矩阵a[i][j]存储无向图,对于每一个顶点有m种颜色可以涂。

北京理工大学《数据结构与算法设计》实验报告实验一

北京理工大学《数据结构与算法设计》实验报告实验一

北京理⼯⼤学《数据结构与算法设计》实验报告实验⼀《数据结构与算法设计》实验报告——实验⼀学院:班级:学号:姓名:⼀、实验⽬的1.通过实验实践、巩固线性表的相关操作;2.熟悉VC环境,加强编程、调试的练习;3.⽤C语⾔编写函数,实现循环链表的建⽴、插⼊、删除、取数据等基本操作;4.理论知识与实际问题相结合,利⽤上述基本操作实现约瑟夫环。

⼆、实验内容1、采⽤单向环表实现约瑟夫环。

请按以下要求编程实现:①从键盘输⼊整数m,通过create函数⽣成⼀个具有m个结点的单向环表。

环表中的结点编号依次为1,2,……,m。

②从键盘输⼊整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下⼀个结点开始重新计数到n,这样,不断进⾏计数,不断进⾏输出,直到输出了这个环表的全部结点为⽌。

三、程序设计1、概要设计为实现上述程序功能,应⽤单向环表寄存编号,为此需要建⽴⼀个抽象数据类型:单向环表。

(1)、单向环表的抽象数据类型定义为:ADT Joseph{数据对象:D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}数据关系:R1={ |ai∈D,i=1,2,……,n}基本操作:create(&L,n)操作结果:构造⼀个有n个结点的单向环表L。

show(L)初始条件:单向环表L已存在。

操作结果:按顺序在屏幕上输出L的数据元素。

Josephf( L,m,s,n)初始条件:单向环表L已存在, s>0,n>0,s操作结果:返回约瑟夫环的计算结果。

}ADT Joseph(2)、主程序流程主程序⾸先调⽤create(&L,n)函数,创建含有m个节点的单向环表L,然后调⽤show(L)函数,顺序输出链表中的数据,最后调⽤Josephf( L,m,s,n)函数,依次输出报的数。

(3)、函数调⽤关系图2、详细设计(1)、数据类型设计typedef int ElemType; //定义元素类型typedef struct Lnode{ElemType data;struct Lnode *next;}Lnode,*Linklist; //定义节点类型,指针类型(2)、操作算法程序实现:void create(Linklist &L,int m){//⽣成⼀个具有m个结点的单向环表,环表中的结点编号依次为1,2,……,m Linklist h,p;L=(Linklist)malloc(sizeof(Lnode));L->data = 1;h=L;for(int i=2;i<=m;i++){p = (Linklist)malloc(sizeof(Lnode));p->data = i; //⽣成新节点,数据为节点编号h->next = p;h = p; //插⼊链表}h->next = L; //形成循环链表}void show(Linklist L,int m){//从第⼀个节点开始依次输出节点编号printf("The numbers of the list are: \n"); //提⽰⽤户h=L;for(int i=1;i<=m;i++){printf("%d ",h->data);h = h->next;}printf("\n");}void Josephf(Linklist &L,int m,int s,int n){//实现约瑟夫环Linklist h,q;h = L;q = L;while(h->data != s) //定位开始的节点h = h->next;while(q->next!=h) //定位在开始位置的上⼀个节点q = q->next; for(int j=1;j<=m;j++){int i=1;while(i{q=q->next;i++;}printf("%d ",q->next->data); //依次输出报号为n的节点q->next = q->next->next; //删除已输出节点}printf("\n");}(3)、主程序的代码实现:int main(){int s,m,n;printf("请输⼊节点数m:\n"); scanf("%d",&m);create(L,m); //建⽴循环链表show(L,m); //输出链表数据printf("请输⼊起始位置s:\n"); scanf("%d",&s);printf("请输⼊报的数n:\n"); scanf("%d",&n);Josephf(L,m,s,n); //输出所报数字。

算法设计算法实验报告(3篇)

算法设计算法实验报告(3篇)

第1篇一、实验目的本次实验旨在通过实际操作,加深对算法设计方法、基本思想、基本步骤和基本方法的理解与掌握。

通过具体问题的解决,提高利用课堂所学知识解决实际问题的能力,并培养综合应用所学知识解决复杂问题的能力。

二、实验内容1. 实验一:排序算法分析- 实验内容:分析比较冒泡排序、选择排序、插入排序、快速排序、归并排序等基本排序算法的效率。

- 实验步骤:1. 编写各排序算法的C++实现。

2. 使用随机生成的不同规模的数据集进行测试。

3. 记录并比较各算法的运行时间。

4. 分析不同排序算法的时间复杂度和空间复杂度。

2. 实验二:背包问题- 实验内容:使用贪心算法、回溯法、分支限界法解决0-1背包问题。

- 实验步骤:1. 编写贪心算法、回溯法和分支限界法的C++实现。

2. 使用标准测试数据集进行测试。

3. 对比分析三种算法的执行时间和求解质量。

3. 实验三:矩阵链乘问题- 实验内容:使用动态规划算法解决矩阵链乘问题。

- 实验步骤:1. 编写动态规划算法的C++实现。

2. 使用不同规模的矩阵链乘实例进行测试。

3. 分析算法的时间复杂度和空间复杂度。

4. 实验四:旅行商问题- 实验内容:使用遗传算法解决旅行商问题。

- 实验步骤:1. 设计遗传算法的参数,如种群大小、交叉率、变异率等。

2. 编写遗传算法的C++实现。

3. 使用标准测试数据集进行测试。

4. 分析算法的收敛速度和求解质量。

三、实验结果与分析1. 排序算法分析- 通过实验,我们验证了快速排序在平均情况下具有最佳的性能,其时间复杂度为O(nlogn),优于其他排序算法。

- 冒泡排序、选择排序和插入排序在数据规模较大时效率较低,不适合实际应用。

2. 背包问题- 贪心算法虽然简单,但在某些情况下无法得到最优解。

- 回溯法能够找到最优解,但计算量较大,时间复杂度较高。

- 分支限界法结合了贪心算法和回溯法的特点,能够在保证解质量的同时,降低计算量。

3. 矩阵链乘问题- 动态规划算法能够有效解决矩阵链乘问题,时间复杂度为O(n^3),空间复杂度为O(n^2)。

算法分析与设计实验指导书

算法分析与设计实验指导书

算法分析与设计实验指导书《算法分析与设计》实验指导书本书是为配合《算法分析与设计实验教学⼤纲》⽽编写的上机指导,其⽬的是使学⽣消化理论知识,加深对讲授容的理解,尤其是⼀些算法的实现及其应⽤,培养学⽣独⽴编程和调试程序的能⼒,使学⽣对算法的分析与设计有更深刻的认识。

上机实验⼀般应包括以下⼏个步骤:(1)、准备好上机所需的程序。

⼿编程序应书写整齐,并经⼈⼯检查⽆误后才能上机。

(2)、上机输⼊和调试⾃⼰所编的程序。

⼀⼈⼀组,独⽴上机调试,上机时出现的问题,最好独⽴解决。

(3)、上机结束后,整理出实验报告。

实验报告应包括:1)问题分析2)算法描述3)运⾏结果、4)算法性能分析。

实验⼀实验名称:贪⼼算法应⽤及设计实验学时:6学时实验类型:验证实验⽬的:1.理解贪⼼算法的基本思想2.掌握利⽤贪⼼算法求解问题的求解步骤实验容1.活动选择问题(2学时)问题描述:设有11个会议等待安排,⽤贪⼼法找出满⾜⽬标要求的会议集合,这些会议按结束时间的⾮减序排列如下表。

实验实现提⽰:1)数据结构设计:将会议开始时间存储在数组B中,结束时间存储在数组E中,数组下标为会议的代码。

结果存储在数组A中,其元素A[i]==true,表⽰会议i被选中。

2)算法:void GreedySelect(int n, struct time B[], struct time E[], bool A[]){int i,j;A[1]=true;j=1; i=2;while( i<=n)if (B[i]>=E[j]){ A[i]=true; j=i;}elseA[i]=false;}思考题:证明所得的解是最优解?2.单源点最短路径问题。

(2学时)问题描述如图所⽰的有向带权图中,求源点0到其余顶点的最短路径及最短路径长度。

并对算法进⾏性能分析。

实现提⽰1)数据结构设计:将图存储在邻接矩阵C中,结点个数为n,源点编号为u, 源点u到其余顶点的最短路径长度存储在dist[],最短路径存储在p[]。

算法分析实验一报告

算法分析实验一报告

《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.1.彼岸内容描述:突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。

现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei 必定会在该空间上碰到一种颜色的珠子。

如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。

比如经过长度为3的悬崖,碰到的珠子先后为“红黄蓝”,或者“蓝红黄”等类似情况就会坠落,而如果是“红黄红”或者“红黄黄”等情况则可以安全到达。

现在请问:yifenfei安然抵达彼岸的方法有多少种?输入:输入数据首先给出一个整数C,表示测试组数。

然后是C组数据,每组包含一个正整数n (n<40)。

输出:对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。

每组输出占一行。

例如:输入:2 输出:92 2132.统计问题内容描述:在一无限大的二维平面中,我们做如下假设:1、每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。

输入:首先给出一个正整数C,表示有C组测试数据接下来的C行,每行包含一个整数n (n<=20),表示要走n步。

输出:请编程输出走n步的不同方案总数;每组的输出占一行。

例如:输入:2 输出:31 723.Message Decowing内容描述:The cows are thrilled because they've just learned about encrypting messages. Theythink they will be able to use secret messages to plot meetings with cows on other farms.Cows are not known for their intelligence. Their encryption method is nothing like DES or BlowFish or any of those really good secret coding methods. No, they are using a simple substitution cipher.The cows have a decryption key and a secret message. Help them decode it. The key looks like this:yrwhsoujgcxqbativndfezmlpkWhich means that an 'a' in the secret message really means 'y'; a 'b' in the secret message really means 'r'; a 'c' decrypts to 'w'; and so on. Blanks are not encrypted; they are simply kept in place. Input text is in upper or lower case, both decrypt using the same decryption key, keeping the appropriate case, of course.输入:* Line 1: 26 lower case characters representing the decryption key* Line 2: As many as 80 characters that are the message to be decoded输出:* Line 1: A single line that is the decoded message. It should have the same length as the second line of input.例如:输入:eydbkmiqugjxlvtzpnwohracsfKifq oua zarxa suar bti yaagrj fa xtfgrj输出:Jump the fence when you seeing me coming二、算法过程设计.第一题是一个典型的递归问题,通过对开始的几项附初始值,通过循环利用通项公式依次递归调用公式便可以得到第n项的值。

算法基础实验报告

算法基础实验报告

一、实验目的本次实验旨在帮助学生掌握算法的基本概念、设计方法和分析方法,通过实际操作加深对算法原理的理解,提高编程能力和问题解决能力。

二、实验内容1. 实验一:排序算法(1)实验目的:掌握常见的排序算法,如冒泡排序、选择排序、插入排序、快速排序等,并分析其时间复杂度和空间复杂度。

(2)实验内容:① 冒泡排序:通过相邻元素的比较和交换,将待排序序列变为有序序列。

② 选择排序:每次从待排序序列中选出最小(或最大)的元素,将其放到序列的起始位置。

③ 插入排序:将无序序列的元素逐个插入到已排序序列的合适位置。

④ 快速排序:通过一趟排序将待排序序列分为独立的两部分,其中一部分的所有元素均比另一部分的所有元素小。

(3)实验步骤:① 编写每个排序算法的代码;② 编写测试代码,验证排序算法的正确性;③ 分析每个排序算法的时间复杂度和空间复杂度。

2. 实验二:查找算法(1)实验目的:掌握常见的查找算法,如顺序查找、二分查找等,并分析其时间复杂度和空间复杂度。

(2)实验内容:① 顺序查找:从序列的起始位置逐个比较,找到待查找元素。

② 二分查找:对于有序序列,每次将待查找元素与序列中间的元素比较,缩小查找范围。

(3)实验步骤:① 编写每个查找算法的代码;② 编写测试代码,验证查找算法的正确性;③ 分析每个查找算法的时间复杂度和空间复杂度。

3. 实验三:图算法(1)实验目的:掌握常见的图算法,如深度优先搜索(DFS)、广度优先搜索(BFS)等,并分析其时间复杂度和空间复杂度。

(2)实验内容:① 深度优先搜索:从给定顶点开始,探索所有相邻顶点,直至所有可达顶点都被访问。

② 广度优先搜索:从给定顶点开始,按照顶点之间的距离顺序访问相邻顶点。

(3)实验步骤:① 编写每个图算法的代码;② 编写测试代码,验证图算法的正确性;③ 分析每个图算法的时间复杂度和空间复杂度。

三、实验结果与分析1. 实验一:排序算法(1)冒泡排序、选择排序、插入排序的时间复杂度均为O(n^2),空间复杂度均为O(1)。

算法实验指导书(2010级)

算法实验指导书(2010级)
内容页
实验一递归算法(2学时)
一、实验目的
掌握递归算法的概念和基本思想
二、实验内容
N阶Hanoi塔问题
要求:
(1)写出相应问题的递归算法及程序
(2)要求输出整个搬动过程。
三、实验仪器、设备及材料
PC机,C/C++程序设计语言应用环境。
四、实验原理
递归算法
五、实验步骤
1.理解算法思想和问题要求;
2.编程实现题目要求;
8.实验结果分析,讨论实验指导书中提出的思考题,写出心得与体会。
附录:源代码及说明
三、实验仪器、设备及材料
PC机,C/C++程序设计语言应用环境。
四、实验原理
贪心算法
五、实验步骤
1.理解算法思想和问题要求;
2.编程实现题目要求;
3.上机输入和调试自己所编的程序;
4.验证分析实验结果;
5.整理出实验报告。
六、实验报告要求
1.阐述实验目的和实验内容;
2.说明程序中的数据结构及模块接口功能说明;
4.验证分析实验结果;
5.整理出实验报告。
六、实验报告要求
1.阐述实验目的和实验内容;
2.说明程序中的数据结构及模块接口功能说明;
3.提交实验程序的源码及文档;
4.记录最终测试数据和测试结果。
七、实验注意事项
八、思考题
1.用动态规划方法设计一个解决最优二分检索树的算法。
实验五图的搜索之回溯算法(2学时)
PC机,C/C++程序设计语言应用环境。
四、实验原理
分治算法
五、实验步骤
1.理解算法思想和问题要求;
2.编程实现题目要求;
3.上机输入和调试自己所编的程序;

《算法设计与分析》实验指导书

《算法设计与分析》实验指导书

《算法设计与分析》实验指导书《算法设计与分析》实验指导书本文档主要用于《算法设计与分析》课程的实验指导。

《算法设计与分析》旨在教会学生处理各种问题的方法,通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。

通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识,培养学生的实际动手能力,加强学生创新思维能力的培养。

本课程设计了7个设计型实验。

实验内容包括用分治法、动态规划、贪心法、回溯法以及分支限界法求解问题。

一、实验内容安排二、实验基本要求实验前要求学生一定要先了解实验目的、内容、要求以及注意事项,要求学生熟悉实验对象,设计并编写相应的算法。

学生应独立完成所布置实验内容,编写代码,运行程序,记录结果并撰写实验报告。

三、实验报告要求实验结束后,应及时整理出实验报告,实验报告提交书面文档。

四、考核方式理论考试(60%)+实验(30%)+作业(10%)五、实验内容与指导实验一快速排序问题1.实验目的(1) 用分治法求解该问题。

2.实验环境PC机,要求安装Eclipse软件或VC++软件供学生实验。

3.实验内容有n个无序的数值数据,现要求将其排列成一个有序的序列。

4. 实验步骤(1) 输入实现该问题的源代码;(2) 输入测试数据,验证代码的正确性。

5.实验要求(1)做好实验预习,熟悉本实验中所使用的开发环境。

(2)写出实验报告①实验目的②实验内容③出错信息及处理方法④实验结果实验二最少硬币问题1.实验目的(1) 用动态规划求解该问题。

2.实验环境PC机,要求安装Eclipse软件或VC++软件供学生实验。

3.实验内容有n种不同面值的硬币,各硬币面值存于数组T[1:n];现用这些面值的钱来找钱;各面值的个数存在数组Num[1:n]中。

对于给定的1≤n≤10,硬币面值数组、各面值的个数及钱数m,0<=m<=2001,设计一个算法,计算找钱m的最少硬币数。

《算法设计与分析》课程实验报告 (算法问题求解基础1)

《算法设计与分析》课程实验报告 (算法问题求解基础1)
s1[i] = s1[i-1] * 10 + pow(10,i-1);
}
int s2[10] = {0,9,189,2889,38889,488889,5888889,68888889,788888889};
int a;
scanf("%d",&a);
int count;
count = 0;
while(a > 0){
题目二:最大间隙
源码:
#include<iostream>
#include<cstdio>
using namespace std;
double a[10000] = {0};
int main(){
int n;
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>a[i];
样例输出:
3.2
二、实验目的
(1)理解算法的概念
(2)理解函数渐近态的概念和表示方法
(3)初步掌握算法时间复杂度的计算方法
三、实验要求
(1)对于每个题目提交实验代码。
(2)根据程序设计测试数据,并记录测试结果,要求边界情况必须测试
(3)使用我们学过的分析方法分析你的算法的时间效率,如果可能,请进行算法的优化,尽量减小算法的时间效率或空间效率。
《算法设计与分析》课程实验报告
实验序号:1 实验项目名称:算法问题求解基础
一、实验题目
题目一:统计数字问题
题目描述
一本书的页码从自然数1开始顺序编码直到自然数n。输的页码按照通常的习惯编排,每个页码都不含有多余的前导数字0.例如,第6页用数字6表示,而不是06或者006等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2...8,9。

《算法设计与分析》实验指导书 bfm(全)

《算法设计与分析》实验指导书 bfm(全)

《算法设计与分析》实验指导书计算机学院信息安全系毕方明本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。

上机实验一般应包括以下几个步骤:(1)、准备好上机所需的程序。

手编程序应书写整齐,并经人工检查无误后才能上机。

(2)、上机输入和调试自己所编的程序。

一人一组,独立上机调试,上机时出现的问题,最好独立解决。

(3)、上机结束后,整理出实验报告。

实验报告应包括:题目、程序清单、运行结果、对运行情况所作的分析。

本书共分阶段4个实验,每个实验有基本题和提高题。

基本题必须完成,提高题根据自己实际情况进行取舍。

题目不限定如下题目,可根据自己兴趣爱好做一些与实验内容相关的其他题目,如动态规划法中的图象压缩,回溯法中的人机对弈等。

其具体要求和步骤如下:实验一分治与递归(4学时)一、实验目的与要求1、熟悉C/C++语言的集成开发环境;2、通过本实验加深对递归过程的理解二、实验内容:掌握递归算法的概念和基本思想,分析并掌握“整数划分”问题的递归算法。

三、实验题任意输入一个整数,输出结果能够用递归方法实现整数的划分。

四、实验步骤1.理解算法思想和问题要求;2.编程实现题目要求;3.上机输入和调试自己所编的程序;4.验证分析实验结果;5.整理出实验报告。

一、实验目的与要求1、掌握棋盘覆盖问题的算法;2、初步掌握分治算法二、实验题:盘覆盖问题:在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。

在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

三、实验提示void chessBoard(int tr, int tc, int dr, int dc, int size){if (size == 1) return;int t = tile++, // L型骨牌号s = size/2; // 分割棋盘// 覆盖左上角子棋盘if (dr < tr + s && dc < tc + s)// 特殊方格在此棋盘中chessBoard(tr, tc, dr, dc, s);else {// 此棋盘中无特殊方格// 用t 号L型骨牌覆盖右下角board[tr + s - 1][tc + s - 1] = t;// 覆盖其余方格chessBoard(tr, tc, tr+s-1, tc+s-1, s);}// 覆盖右上角子棋盘if (dr < tr + s && dc >= tc + s)// 特殊方格在此棋盘中chessBoard(tr, tc+s, dr, dc, s);else {// 此棋盘中无特殊方格// 用t 号L型骨牌覆盖左下角board[tr + s - 1][tc + s] = t;// 覆盖其余方格chessBoard(tr, tc+s, tr+s-1, tc+s, s);}// 覆盖左下角子棋盘if (dr >= tr + s && dc < tc + s)// 特殊方格在此棋盘中chessBoard(tr+s, tc, dr, dc, s);else {// 用t 号L型骨牌覆盖右上角board[tr + s][tc + s - 1] = t;// 覆盖其余方格chessBoard(tr+s, tc, tr+s, tc+s-1, s);}// 覆盖右下角子棋盘if (dr >= tr + s && dc >= tc + s)// 特殊方格在此棋盘中chessBoard(tr+s, tc+s, dr, dc, s);else {// 用t 号L型骨牌覆盖左上角board[tr + s][tc + s] = t;// 覆盖其余方格chessBoard(tr+s, tc+s, tr+s, tc+s, s);}}一、实验目的与要求1、熟悉二分搜索算法;2、初步掌握分治算法;二、实验题1、设a[0:n-1]是一个已排好序的数组。

BX110937l李建辉 实验03

BX110937l李建辉 实验03
(4)接口实验该程序,然后按【思考问题】内容修改和观察程序。
interface rec_Area_Peri
{ int getArea();
int getPerimeter();
}
class rectangle implements rec_Area_Peri
4)将Bus类和Car类放置到.sdju.exp032包中,将Driver类改为private型,则编译错误。放回仍然错误。说明抽象类不能为private类型。

(3)
(4)
出现了错误,因为接口中声明了子方法都必须在子类中具体实现,由于只实现了一个,就出现了错误
出现了错误,因为如果去掉public则只有同一个包中的类才能实现这个借口,不同包的类均无法实现这个接口,使之出现错误。
}
}
【思考问题】
在实现类rectangle中注释掉一个方法后进行编译,看发生了什么?为什么?
在实现类rectangle中将各实现方法前的public修饰符去掉再进行编译,看发生了什么?为什么?
将接口rec_Area_Peri中定义的两个方法前加上abstract修饰符再编译,看对程序有影响否?为什么?
电子信息学院
实验报告书
课程名:
面向对象程序设计(Java)
题目:
实验03继承、接口和多态
实验类别:
【验证、设计】
班级:
BX1109
学号:
37
姓名:
李建辉
一、实验目的
(1)掌握类的继承机制。
(2)熟悉类中成员变量和方法的访问控制。
(3)熟悉方法或构造方法多态性。
(4)熟悉接口的定义方法。
二、实验内容
(1)定义一个球类Ball,包含一个私有成员变量——半径(double r),两个公有成员方法:设定半径方法(void setR(double x))、得到半径值方法(double getR())。

算法与数据结构实验1

算法与数据结构实验1

福建农林大学实验报告系(教研室):计算机专业:年级:实验课程:姓名:学号:实验室号:_ 计算机号:实验时间:指导教师签字:成绩:实验一:完成一元多项式的相加相乘运算(验证性、4学时)一、实验目的和要求完成多项式的相加、相乘运算。

(1)掌握线性表的插入、删除、查找等基本操作设计与实现(2)学习利用线性表提供的接口去求解实际问题(3)熟悉线性表的的存储方法二、实验内容和原理1.实验内容设计一个一元多项式的简单计算程序,其基本功能有:(1)输入并建立多项式;(2)输出多项式;(3)多项式的相加相乘运算。

利用单链表实现。

2.实验原理使用单链表实现一元多项式的存储,并实现两个一元多项式的加法乘法运算。

三、实验环境硬件:(1)学生用微机(2)多媒体教室或远程教学(3)局域网环境软件:(1)Windows XP中文操作系统(2)Turbo C 3.0或者VC6.0四、算法描述及实验步骤1、描述1.定义创建链表的函数,然后创建链表,用于存放结果。

2.定义多项式相加的函数实现多项式的相加功能。

3.定义打印链表和释放链表的函数。

4.最后在主函数里面调用这些函数,实现多项式的相加相乘。

例:(1)A(X)= 9x+3X2B(X)= 2X2(2)A(X)= 2x +6X2+6X3B(X)= 2X2(1)执行加法操作,输出“相加后的结果为9x+5X2”执行乘法操作,输出“相加后的结果为18X3+6X4”(2)执行加法操作,输出“相加后的结果为2x+8X2+6X3”执行乘法操作,输出“相加后的结果为4X3+12X4+12X5”2、算法流程图3、代码(注释)#include<iostream>#include<malloc.h>using namespace std;struct Node{ float coef;//结点类型int exp; };typedef Node polynomial;struct LNode{ polynomial data;//链表类型LNode *next; };typedef LNode* Link;void CreateLink(Link &L,int n);void PrintList(Link L);void PolyAdd(Link &pc,Link pa,Link pb);void CopyLink(Link &pc,Link pa);void PolyMultiply(Link &pc,Link pa,Link pb);int JudgeIfExpSame(Link pa,Link e);void DestroyLink(Link &L);int CompareIfNum(int i);void DestroyLink(Link &L){ Link p; p=L->next;while(p){ L->next=p->next; delete p; p=L->next; }delete L; L=NULL; }//创建含有n个链表类型结点的项,即创建一个n项多项式void CreateLink(Link &L,int n){ if(L!=NULL){ DestroyLink(L); }Link p,newp;L=new LNode; L->next=NULL;(L->data).exp=-1;//创建头结点p=L;for(int i=1;i<=n;i++){ newp=new LNode;cout<<"请输入第"<<i<<"项的系数和指数:"<<endl;cout<<"系数:";cin>>(newp->data).coef;cout<<"指数:";cin>>(newp->data).exp;if(newp->data.exp<0){ cout<<"您输入有误,指数不允许为负值!"<<endl;delete newp; i--; continue; }newp->next=NULL;p=L;if(newp->data.coef==0){ cout<<"系数为零,重新输入!"<<endl;delete newp; i--; continue; }while((p->next!=NULL)&&((p->next->data).exp<(newp->data).exp)) { p=p->next; //p指向指数最小的那一个}if(!JudgeIfExpSame( L, newp)){ newp->next=p->next;p->next=newp; }else{ cout<<"输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式"<<endl; delete newp;DestroyLink(L);CreateLink(L,n); //创建多项式没有成功,递归调用重新创建break; } } }/*判断指数是否与多项式中已存在的某项相同*/int JudgeIfExpSame(Link L,Link e){ Link p;p=L->next;while(p!=NULL&&(e->data.exp!=p->data.exp))p=p->next;if(p==NULL)return 0;else return 1; }/*输出链表*/void PrintList(Link L){ Link p;if(L==NULL||L->next==NULL)cout<<"该一元多项式为空!"<<endl;else { p=L->next;//项的系数大于0的5种情况if((p->data).coef>0){ if((p->data).exp==0) cout<<(p->data).coef;else if((p->data).coef==1&&(p->data).exp==1) cout<<"x";else if((p->data).coef==1&&(p->data).exp!=1) cout<<"x^"<<(p->data).exp;else if((p->data).exp==1&&(p->data).coef!=1) cout<<(p->data).coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }//项的系数小于0的5种情况if((p->data).coef<0){ if((p->data).exp==0) cout<<(p->data).coef;else if(p->data.coef==-1&&p->data.exp==1) cout<<"-x";else if(p->data.coef==-1&&p->data.exp!=1) cout<<"-x^"<<p->data.exp;else if(p->data.exp==1) cout<<p->data.coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }p=p->next;while(p!=NULL){ if((p->data).coef>0){ if((p->data).exp==0) cout<<"+"<<(p->data).coef;else if((p->data).exp==1&&(p->data).coef!=1) cout<<"+"<<(p->data).coef<<"x";else if((p->data).exp==1&&(p->data).coef==1) cout<<"+"<<"x";else if((p->data).coef==1&&(p->data).exp!=1) cout<<"+"<<"x^"<<(p->data).exp;else cout<<"+"<<(p->data).coef<<"x^"<<(p->data).exp; }if((p->data).coef<0){ if((p->data).exp==0) cout<<(p->data).coef;else if(p->data.coef==-1&&p->data.exp==1) cout<<"-x";else if(p->data.coef==-1&&p->data.exp!=1) cout<<"-x^"<<p->data.exp;else if(p->data.exp==1) cout<<p->data.coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }p=p->next; } }cout<<endl; }/*把一个链表的内容复制给另一个链表*/void CopyLink(Link &pc,Link pa){ Link p,q,r;pc=new LNode; pc->next=NULL; r=pc; p=pa;while(p->next!=NULL){ q=new LNode;q->data.coef=p->next->data.coef; q->data.exp=p->next->data.exp;r->next=q; q->next=NULL; r=q; p=p->next; } }/*将两个一元多项式相加*/void PolyAdd(Link &pc,Link pa,Link pb){ Link p1,p2,p,pd;CopyLink(p1,pa);CopyLink(p2,pb);pc=new LNode; pc->next=NULL; p=pc; p1=p1->next; p2=p2->next;while(p1!=NULL&&p2!=NULL){ if(p1->data.exp<p2->data.exp){ p->next=p1; p=p->next; p1=p1->next; }else if(p1->data.exp>p2->data.exp){ p->next=p2; p=p->next; p2=p2->next; }else { p1->data.coef=p1->data.coef+p2->data.coef;if(p1->data.coef!=0) { p->next=p1; p=p->next; p1=p1->next; p2=p2->next; } else { pd=p1; p1=p1->next; p2=p2->next; delete pd; } } }if(p1!=NULL) { p->next=p1; }if(p2!=NULL) { p->next=p2; } }//清屏函数void Clear(){ system("pause");system("cls"); }/*将两个一元多项式相乘*/void PolyMultiply(Link &pc,Link pa,Link pb){ Link p1,p2,p,pd,newp,t;pc=new LNode; pc->next=NULL; p1=pa->next; p2=pb->next;while(p1!=NULL){ pd=new LNode; pd->next=NULL;p=new LNode; p->next=NULL; t=p;while(p2){ newp=new LNode; newp->next=NULL;newp->data.coef=p1->data.coef*p2->data.coef; newp->data.exp=p1->data.exp+p2->data.exp; t->next=newp; t=t->next; p2=p2->next; }PolyAdd(pd,pc,p);CopyLink(pc,pd);p1=p1->next; p2=pb->next;DestroyLink(p); DestroyLink(pd); } }//菜单函数void Menu(){ cout<<"\t\t 1创建要运算的两个一元多项式\t\t"<<endl;cout<<"\t\t 2将两个一元多项式相加\t\t"<<endl;cout<<"\t\t 3将两个一元多项式相乘\t\t"<<endl;cout<<"\t\t 请输入你要进行的操作(1-3)\t\t"<<endl; }//判断输入的整数是不是为1到3的数字int CompareIfNum(int i){ if(i>0&&i<4)return 0; else return 1; }void main(){ int n;Link L,La=NULL,Lb=NULL;//La,Lb分别为创建的两个多项式int choose;while(1){ Menu(); //调用菜单函数cin>>choose;switch(choose){ case 1:cout<<"请输入你要运算的第一个一元多项式的项数:"<<endl;cin>>n;if(CompareIfNum(n)==1){ cout<<"您的输入有误,请重新输入……"<<endl; Clear(); break; } CreateLink(La,n);cout<<"请输入你要运算的第二个一元多项式的项数:"<<endl;cin>>n;if(CompareIfNum(n)==1){ cout<<"您的输入有误,请重新输入……"<<endl; Clear(); break; } CreateLink(Lb,n); Clear(); break;case 2:if(La==NULL||Lb==NULL){ cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear(); break; } PolyAdd(L,La,Lb);cout<<"相加的两个一元多项式为:"<<endl;PrintList(La); PrintList(Lb);cout<<"相加后的结果为:"<<endl;PrintList(L);Clear(); DestroyLink(L); break;case 3:if(La==NULL||Lb==NULL){ cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear(); break; } PolyMultiply(L,La,Lb);cout<<"相乘的两个一元多项式为:"<<endl;PrintList(La); PrintList(Lb);cout<<"相乘后的结果为:"<<endl;PrintList(L); DestroyLink(L); Clear(); break; }} }五、调试过程#include <alloc.h>语句出错,少了一个m,后来改为#include <malloc.h>,就编译通过了。

【VIP专享】BX110937l李建辉 实验01

【VIP专享】BX110937l李建辉 实验01

《面向对象程序设计》实验报告 1 一、实验目的(1)掌握设置 Java 程序运行环境的方法,并熟悉Java程序的集成开发工具Eclipse。

(2)掌握编写、编译、运行简单的Java Application和Java Applet程序的方法步骤,初步了解java程序的特点和基本结构。

(3)掌握 Java 基本数据类型、运算符与表达式。

(4)理解 Java 程序语法结构,掌握顺序结构、选择结构和循环结构语法的程序设计方法。

二、实验内容(1)安装JDK软件开发包和JRE运行环境,并配置好path和classpath。

(2)编写一个Java Application,利用JDK软件包中的工具编译并运行这个程序,使之能够输出字符串信息“Hello World!”。

步骤①:编写、编译Java 源程序。

打开记事本或UE等文本编辑器,新建一个java文件,键入如下程序代码:public class Hello{public static void main(String args[]){ System.out.println("Hello, World!"); }}将文件命名为Hello.java,注意保存文件Hello.java到路径“D:\java\”下。

步骤②:编译Java 源程序Java 源程序编写后,要使用Java编译器(javac.exe)将Java 源程序编译成字节码文件。

Java源程序都是扩展名为.java的文本文件。

编译时首先读入Java源程序,然后进行语法检查,如果出现问题就终止编译。

语法检查通过后,生成可执行程序代码即字节码,字节码文件名和源文件名相同,扩展名为.class。

打开命令提示符窗口(MS-DOS 窗口)进入Java 源程序所在路径D:\java\。

键入编译器文件名和要编译的源程序文件名,具体如下:D:\java>javac -d class Hello.java按回车键开始编译(注意:文件名H要大写,否则运行会出问题)。

BX110937李建辉算法设计实验六

BX110937李建辉算法设计实验六

合用标准文案电子信息学院实验报告书课程名:算法设计与解析题目:实验六动向规那么实验种类【设计型】班级:BX1109学号:37姓名:李建辉考语:实验态度:认真〔〕一般〔〕较差〔〕实验结果:正确〔〕局部正确〔〕错〔〕实验理论:掌握〔〕熟悉〔〕认识〔〕生疏〔〕操作技术:较强〔〕一般〔〕较差〔〕实验报告:较好〔〕一般〔〕较差〔〕成绩:指导教师:王淮亭批阅时间:2021年 05 月 05日1.实验目的〔 1〕初步掌握动向规划算法〔 2〕可以运用动向规划的思想解决实责问题,如矩阵连乘问题等2.实验要求〔 1〕n 个矩阵连乘问题。

〔 2〕应用顺推实现动向规划求解n 行 m列边数值矩阵最大的行程, n 行 m列的边数值矩阵,每一个点可向右或向下两个去向,试求左上角极点到右下角极点的所经边数值和最大的行程。

〔 3〕求解点数值矩阵最小路径,随机产生一个n 行 m列的整数矩阵 , 在整数矩阵中搜寻从左上角至右下角 , 每步可向下 (D) 或向右 (R) 或斜向右下 (O) 的一条数值和最小的路径。

〔 4〕应用递推实现动向规划求解序列的最小子段和。

〔 5〕插入加号求最小值,在一个 n 位整数 a 中插入 r 个加号,将它分成 r+1 个整数,找出一种加号的插入方法,使得这r+1 个整数的和最小。

3.实验原理动向规划的根本思想:动向规划法的实质也是将较大问题分解为较小的同类子问题,这一点上它与分治法和贪心法近似。

但动向规划法有自己的特点。

分治法的子问题相互独立,相同的子问题被重复计算,动向规划法解决这种子问题重叠现象。

贪心法要求针对问题设计最优量度标准,但这在很多情况下其实不简单。

动向规划法利用最优子构造,自底向上从子问题的最优解渐渐构造出整个问题的最优解,动向规划那么可以办理不具备贪心准那么的问题4.实验设备PC机5.实验步骤〔 1〕刻画最优解的构造特点;〔 2〕递归定义最优解值;〔 3〕以自底向上方式计算最优解值;〔 4〕依照计算获取的信息构造一个最优解。

算法设计与分析实验指导书

算法设计与分析实验指导书

算法设计与分析实验指导书东北大学软件学院2012年目录算法设计与分析 (1)实验指导书 (1)前言 (3)实验要求 (4)实验1 分治法的应用(2学时) (5)1.实验目的 (5)2.实验类型 (5)3.预习要求 (5)4.实验基本要求 (5)5.实验基本步骤 (7)实验2动态规划(2学时) (11)1.实验目的 (11)2.实验类型 (11)3.预习要求 (11)4.实验基本要求 (11)5.实验基本步骤 (12)实验3 回溯法(4学时) (16)1.实验目的 (16)2.实验类型 (16)3.预习要求 (16)4.实验基本要求 (16)5.实验基本步骤 (17)前言《算法设计与分析》是一门面向设计,处于计算机科学与技术学科核心地位的教育课程。

通过对计算机算法系统的学习,使学生理解和掌握计算机算法的通用设计方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定基础。

要求掌握算法复杂度分析、分治法、动态规划法、贪心法、回溯法、分支限界法等算法的设计方法及其分析方法。

能将这些方法灵活的应用到相应的问题中,并且能够用C++实现所涉及的算法,并尽量做到低复杂度,高效率。

通过本课程的实验,使学生加深对课程内容的理解,培养学生严密的思维能力,运用所学知识结合具体问题设计适用的算法的能力;培养学生良好的设计风格,激励学生创造新算法和改进旧算法的愿望和热情。

希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养。

希望同学们在使用本实验指导书及进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《算法设计与分析》课程成为对大家有益的课程。

实验要求《算法设计与分析》课程实验的目的是为了使学生在课堂学习的同时,通过一系列的实验,使学生加深理解和更好地掌握《算法设计与分析》课程教学大纲要求的内容。

在《算法设计与分析》的课程实验过程中,要求学生做到:(1)仔细观察调试程序过程中出现的各种问题,记录主要问题,做出必要说明和分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("不是真分数\n");
return 0;
}ห้องสมุดไป่ตู้
printf("%d/%d = ", a, b);
while(1)
{
if(b%a==0) /*若分母是分子的倍数,直接变成埃及分数*/
{
i=b/a;
a=1;
}
else/*否则分解出一个分母为(b/a)+1的埃及分数*/
i=(b/a)+1; /*这个括号不是必须的,为的是看起来更清晰*/
电子信息学院
实验报告书
课程名:算法设计与分析
题 目:实验一C/C++环境及算法复杂度理解
实验类别【设计型】
班 级:BX1109
学 号:37
**********
1.实验目的
(1)熟悉C/C++语言的集成开发环境;
(2)通过简单的算法程序设计,了解算法复杂度的含义。
2.实验内容与步骤
(一)实验内容
(1)分数分解算法描述,把真分数a/b分解为若干个分母为整数分子为“1”的埃及分数之和;
4.结果分析与实验体会
(一)实验结果
图1-1 真分数分解成埃及分数
图1-2 n个1整除2011
图1-3n个1整除2013
(二)结果分析
(1)真分数分解成埃及分数结果分析
1)在寻找埃及分数的过程中,没有采用穷举的方法,尝试所有可能的埃及分数;而是采用计算来直接找到最可能的埃及分数,分母为(b/a)+1,后者效率比前者高。
if(a==1)/*分子为1了,该结束了*/
{
printf("1/%d\n",i);
break;
}
else if(a==3&&b%2==0) /*这块不是必须的,若分子为3分母为偶数,一定可以直接分解成两个埃及分数1/(b/2)+1/b,然后就该结束了*/
{
printf("1/%d + 1/%d\n",b/2,b);
break;
}
else
{
printf("1/%d + ",i);
fflush(stdout);/*这不是必须的,为的是能立即看到每一个分解的埃及分数*/
}
/*从 a/b中减去那个埃及分数*/
a=a*i-b;
b=b*i;
}
return 0;
}
N个1整除2011源程序
#include<stdio.h>
void main()
(2)据例1-2的算法,写出求解n个“1”组成的整数能被2011整除的程序。修改程序,求出 n至少为多大时,n个“1”组成的整数能被2013整除?。
(二)实验步骤
(1)分数分解成埃及分数实验步骤
1)定义变量i,用来保存各个埃及分数的分母;
2)如果分母是分子的倍数,直接约简成埃及分数;
3)否则分数中一定包含一个分母为(b/a)+1的埃及分数;
4)如果分子是1,表明已经是埃及分数,不用再分解,结束;
5)如果分子是3而且分母是偶数,直接分解成两个埃及分数1/(b/2)和1/b,结束;
6)从分数中减去这个分母为(b/a)+1的埃及分数,回到步骤2。
(2)N个1组成的整数能被2011整除的程序,修改程序n至少为多大能被2013整除
1)定义变量a,c,p,n,a代表被除数,c用来代表a除p的余数,如果余数为零则a能够整除p,跳出循环,p代表除数,n用来计算1的个数
2)a等于c乘以10再加1,
3)c等于a除以p,c为零则a整除p,计数n加1
4)否则循环2)和3)
5)C为零循环结束输出1的个数n和被除数a
3.实验原理
算法复杂度:一个算法的时间复杂度是指算法运行所需的时间。一个算法的运行时间取决于算法所需执行的语句(运算)的多少。
算法的时间复杂度通常用该算法执行的总语句(运算)的数量级决定。一条语句的数量级即执行它的频数,一个算法的数量级是指它所有语句执行频数之和。
p=2013;
c=1111;
n=4;
while(c!=0)
{
a=c*10+1;
c=a%p;
n=n+1;
}
printf(" 由%d个1组成的整数能被%d\n",n,p);
}
附:源程序
真数分解成埃及分数源程序
#include<stdio.h>
int main()
{
int a=0, b=1;/*分子分母*/
int i;/*i用来保存每一步分解出的埃及分数的分母*/
printf("请输入一个真分数(a/b):");
scanf("%d/%d",&a,&b);
if(a<1||b<=a){
(三)实验体会
通过这次实验我了解了VC++集成开发环境,加深了对算法复杂程度含义的理解,何谓算法复杂程度,即一个算法的时间复杂度是指算法运行所需的时间。一个算法的运行时间取决于算法所需执行的语句(运算)的多少。算法的时间复杂度通常用该算法执行的总语句(运算)的数量级决定。一条语句的数量级即执行它的频数,一个算法的数量级是指它所有语句执行频数之和。不同的算法其时间复杂度可能不同,我们在编程的时候应该尽量减少算法的时间复杂程度,以此减少计算机对cpu的访问,提高程序的执行进程来优化程序。
{
int a,c,p,n;
p=2011;
c=1111;
n=4;
while(c!=0)
{
a=c*10+1;
c=a%p;
n=n+1;
}
printf(" 由%d个1组成的整数能被%d\n",n,p);
}
N个1整除2013时1的最少个数
#include<stdio.h>
void main()
{
int a,c,p,n;
而枚举法中反复约分,而约分本身又涉及到大量的运算,该算法中都简化掉了。
(2)N个1整数2011实验结果分析
1)能够整除2011必然大于2011,故c初值为四个一,通过循环变为五个一,六个一,不断增加1的个数,直到整除2011则停止,时间复杂度为O(n2)
2) 将除数改成2013就是求能整除2013最小的整数
比如,还用8/11为例,分解出1/2和1/5之后还剩下3/110。用穷举或者计算的方法对3/110的分解结果是
3/110=1/37+1/4070。
用常识的的方法分解结果是
3/110=1/55+1/110。
可以看到,前者分母用到了4070那么大,而后者只用到了110。
3)算法在循环中不做约分操作,直接进行计算,是对算法效率的又一个提高。
比如,对.4/123,穷举法从1/2一直遍历到1/31才找到合适的埃及分数,但该算法用123/4+1=31直接就找到1/31。
2)当分子为3时,该算法用常识做了特殊处理,可以提高分解的效率。
假设用2k来表示一个偶数,我们知道3/(2k)可以分解成1/k + 1/(2k),这样分解直接找到两个目标埃及分数,不用逐个再去分解,更不用穷举。
相关文档
最新文档