算法分析与设计求最大公约数问题实验报告

合集下载

求多个数的最大公约数的算法设计

求多个数的最大公约数的算法设计

it= )be k f = x ra ; ( y- ) -;
从多个数 中的最小数开始 由大到小列举 , 直到找到公约数立 即 中断列举 , 到的公约数便是最大公约数 。 得
21枚举法 的算法分析 .
rtr() eu y; n ) vi m i ) o an d (
{ ita8 1 n [0; ili,, n , t j : X
⑥ 若 ixy < ,能被 a ] 除 , tl l整 i t+; = 否则执行⑧ ; ⑦ iil 执行⑥ ; =+ ,
Euci S l o i m a d l s — e u i g e h i u . l d’ ag rt h n o s r d c n t c n q e K e r s g e t s o y wo d : r a e t c mm o d v s r e u r to meh n i io ; n me ai n t od; E c i S a g rt m ; l s —e u i g t c i u ul d’ l o i h o sr d cn e hn q e
Absr c : Ba e n t e l o i m t c lu ae h r a e t c mmo d v s r o wo n m b r ,t l o i m t a c l t t e r a e t ta t s d o h ag rt h o a c l t t e g e t s o n i io f t u e s he a g rt h o c lu a e h g e t s
0 引 言
⑧ 判断 t 是否等于 x 若相 等 , , 返回 Y 若不相等 , y 自 ; 则 值
, 在 C 言教 材 中, 最大公约数 的算 法多以求两个正整数 减 1 并执行④ ; 语 求 ⑨ 输 出x 个正整数的最大公约数。 的最 大公约数 为例加 以说 明 , 并且常用 辗转相除 法求两个正 22 枚举法的算法实现 . 整数的最大公约数 , 求三个或者更 多个 正整数的最大公约数 的 算法 一般未作介 绍 。本 文介绍 了枚 举法和 更相减 损术 来求 多 个正整数的最大公约数 。 c语言的源代码如下 :

求两个数最大公约数问题

求两个数最大公约数问题

实验题目求两个自然数m和n的最大公约数实验目的⑴复习数据结构课程的相关知识,实现课程间的平滑过渡;⑵掌握并应用算法的数学分析和后验分析方法;⑶理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

实验内容(包括代码和对应的执行结果截图)#include<iostream>#include<math.h>using namespace std;int x=0,y=0,z=0,h=0;int lxzs(int m,int n){int t;if(m<n){t=m;x=x+2; //判断语句中基本语句m<n的比较和赋值语句t=m 共执行了2条基本语句}else{t=n;x=x+2;}while(m%t!=0||n%t!=0){t=t-1;x=x+3; //最坏情况,当m%t!=0和n%t!=0都执行了,加上t=t-1,所以每循环一次执行了3条基本语句}return t;}int ojld(int m,int n){int r;r=m%n;y=y+1;while(r!=0){m=n;n=r;r=m%n;y=y+4; //基本语句包括r!=0和m=n;n=r;r=m%n共四条,所以每循环一次,计数器加4}return n;}int zzxjfdg(int m,int n){while(1){if(m>n){m=m-n;z=z+3;}else if(m<n){n=n-m;z=z+4;}elsereturn m;}}int zzxcfdg(int m,int n){while(m*n!=0){if(m>n){m=m%n;h=h+3; //基本语句m*n!=0和m>n和m=m%n的执行,计数器加3}else{n=n%m;h=h+3; //基本语句m*n!=0和m>n和n=n%m的执行,计数器加3}}h=h+1; //基本语句m==0?n:m的执行,计数器加1return (m==0?n:m);}void main(){int m,n;int a,b,c,d;for(int i=0;i<10;i++){cout<<"请输入两个自然数:"<<endl;cin>>m>>n;a=lxzs(m,n);b=ojld(m,n);c=zzxjfdg(m,n);d=zzxcfdg(m,n);cout<<"第1种求两个最大公约数算法得最大公约数为:"<<a<<"基本语句执行次数为:"<<x<<endl;cout<<"第2种求两个最大公约数算法得最大公约数为:"<<b<<"基本语句执行次数为:"<<y<<endl;cout<<"第3种求两个最大公约数算法得最大公约数为:"<<c<<"基本语句执行次数为:"<<z<<endl;cout<<"第4种求两个最大公约数算法得最大公约数为:"<<d<<"基本语句执行次数为:"<<h<<endl;x=0;y=0;z=0;h=0;}}实验结果分析由上述实验结果分析可知,第四种算法效率最高,然后是第二种算法,其次是第三种算法,效率最低的是第一种算法。

编程题实验报告总结

编程题实验报告总结

一、实验目的本次实验旨在通过完成一系列编程题目,提高编程能力,巩固所学知识,并锻炼解决实际问题的能力。

通过实验,我对编程语言的基本语法、数据结构、算法设计等方面有了更深入的理解,同时提升了代码调试和优化能力。

二、实验内容本次实验共完成了以下几道编程题目:1. 打印 Floyd 矩阵2. 求最大公约数3. 判断一个数是否为素数4. 实现冒泡排序算法5. 编写一个简单的计算器三、实验过程1. 打印 Floyd 矩阵首先,我了解到 Floyd 矩阵是一个三维数组,用于表示任意两个顶点之间的最短路径。

为了打印 Floyd 矩阵,我需要编写一个函数,该函数遍历所有顶点对,并计算它们之间的最短路径。

在实现过程中,我使用了双重循环,并在循环中计算相邻顶点之间的距离。

2. 求最大公约数最大公约数是数学中的一个重要概念,表示两个或多个整数共有的最大约数。

为了求最大公约数,我使用了辗转相除法,即不断用较小数去除较大数,直到余数为0。

在实验中,我实现了两个函数:一个用于计算两个整数的最大公约数,另一个用于计算多个整数的最大公约数。

3. 判断一个数是否为素数素数是只能被1和自身整除的数。

为了判断一个数是否为素数,我编写了一个函数,该函数遍历从2到该数-1的所有整数,检查是否存在能整除该数的数。

如果存在,则该数不是素数;否则,它是素数。

4. 实现冒泡排序算法冒泡排序是一种简单的排序算法,通过比较相邻元素的大小,将较大的元素向后移动,较小的元素向前移动,直到整个序列有序。

在实验中,我实现了冒泡排序算法,通过双重循环遍历序列,并交换相邻的逆序对。

5. 编写一个简单的计算器计算器是一个常用的工具,用于进行数学运算。

为了编写一个简单的计算器,我实现了以下功能:加法、减法、乘法、除法。

在实现过程中,我定义了一个函数,用于接收用户输入的两个数和一个运算符,并返回运算结果。

四、实验结果通过完成上述编程题目,我成功实现了以下功能:1. 打印 Floyd 矩阵2. 求最大公约数3. 判断一个数是否为素数4. 实现冒泡排序算法5. 编写一个简单的计算器在实验过程中,我遇到了一些问题,如冒泡排序算法的优化、计算器功能的扩展等。

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。

1、求n个元素的全排。

(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。

(30分)3、设有n=2k个运动员要进行网球循环赛。

设计一个满足要求的比赛日程表。

(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。

三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。

python程序设计最大公约数的计算实验

python程序设计最大公约数的计算实验

一、概述近年来,随着计算机技术的飞速发展,程序设计已经成为计算机科学领域中极具影响力的研究方向。

其中,Python作为一种高效、简洁、易学的编程语言,受到了广泛关注和应用。

本实验旨在利用Python 进行最大公约数的计算,探索其在数学计算方面的应用。

二、最大公约数的定义最大公约数,亦称最大公因数,指两个或多个整数共有约数中最大的一个。

在数学上,最大公约数常用缩写符号"gcd"表示。

两个整数a和b的最大公约数通常表示为gcd(a, b)。

三、Python程序设计实验步骤1. 导入所需的Python模块在进行最大公约数计算之前,首先需要导入Python的数学模块,以便调用其中的数学函数。

```pythonimport math```2. 编写求最大公约数的函数借助Python的函数机制,可以编写一个专门用于求最大公约数的函数。

该函数以两个整数作为参数,返回它们的最大公约数。

```pythondef gcd(a, b):return math.gcd(a, b)```3. 输入待计算的数字通过用户输入的方式,获取需要计算最大公约数的两个整数。

```pythonnum1 = int(input("请输入第一个整数:"))num2 = int(input("请输入第二个整数:"))```4. 调用函数计算最大公约数将用户输入的两个整数作为参数,调用编写的求最大公约数的函数进行计算。

```pythonresult = gcd(num1, num2)print("最大公约数为:", result)```四、实验结果与分析通过以上Python程序设计,可以轻松、高效地求出任意两个整数的最大公约数。

该程序设计不仅简洁清晰,而且具有较高的计算精度和效率。

在数学计算方面,Python程序设计展现了其巨大的优势和应用价值。

五、结论与展望通过本次实验,不仅对Python的函数机制有了更深入的认识,而且对最大公约数的理论知识和计算方法也有了更为清晰的理解。

算法实验1-求最大公约数实验报告

算法实验1-求最大公约数实验报告

精品文档可修改昆明理工大学信息工程与自动化学院学生实验报告( 2011 — 2012 学年第 1 学期)课程名称:算法分析与设计开课实验室:信自楼机房444 2011年10月12日一、上机目的及内容上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

上机内容求两个自然数m和n的最大公约数。

二、实验原理及基本技术路线图(方框原理图或程序流程图)实验原理(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。

流程图三、所用仪器、材料(设备名称、型号、规格等或使用软件)设备:1台PC及VISUAL C++6.0软件。

四、实验方法、步骤(或:程序代码或操作过程)源程序:#include<stdio.h>#include<time.h>#include<stdlib.h>int max(int m,int n){int r;if(m>n)r=n;elser=m;return r;}void Menu(){int a;void algorithmone();void algorithmtwo();void algorithmthree();printf("请选择算法:\n");printf("1.算法一\n");printf("2.算法二\n");printf("3.算法三\n");scanf("%d",&a);getchar();switch(a){case 1:algorithmone();break;case 2:algorithmtwo();break;case 3:algorithmthree();break;default:printf("请输入1,2,3中的一个!\n");}}void algorithmone() //算法一{clock_t start,finish;int m,n,r;char key;printf("求两个数的最大公约数,请输入这两个数:");scanf("%d %d",&m,&n);getchar();start=clock();r=max(m,n);while(r>0){if(m%r==0){if(n%r==0){printf("算法一求出的最大公约数为%d\n",r);finish=clock();break;}elser=r-1;}elser=r-1;}printf("算法一所需的时间是:%ld秒\n",(finish-start));printf("是否返回主菜单?(y/n):");key=getchar();switch(key){case 'y':Menu();break;case 'Y':Menu();break;case 'n':break;case 'N':break;default:printf("error!\n");}}void algorithmtwo() //算法二{clock_t start,finish;int m,n,r;char key;printf("求两个数的最大公约数,请输入这两个数:");scanf("%d %d",&m,&n);start=clock();while((r=m%n)!=0){m=n;n=r;r=m%n;if(r==0){printf("算法二求出的最大公约数为%d\n",n);finish=clock();break;}}printf("算法二所需的时间是:%ld秒\n",(finish-start));getchar();printf("是否返回主菜单?(y/n):");key=getchar();switch(key){case 'y':Menu();break;case 'Y':Menu();break;case 'n':break;case 'N':break;default:printf("error!\n");}}void commonzhishu(int arraym[],int arrayn[]) //提取公共质数{int i,j,k=0,common[3],d=0;for(i=0;i<3;i++)for(j=0;j<3;j++)if(arraym[i]==arrayn[j]){common[k]=arraym[i];k=k+1;}for(k=0;k<3;k++)for(d=k+1;d<3;d++)if(common[k]==common[d])common[d]=1;printf("算法三结果%d\n",common[0]*common[1]*common[2]);}void algorithmthree() //算法三{clock_t start,finish;int m,n,mr,nr,i;float count;char key;mr=2;nr=2;printf("求两个数的最大公约数,请输入这两个数:");scanf("%d %d",&m,&n);int arraym[3],arrayn[3];i=0;start=clock();while(m!=1) //将两数分解{if((count=(float)(m%mr))==0.0){arraym[i]=mr;i++;m=m/mr;}elsemr++;}for(i=0;i<3;i++)printf("%d ",arraym[i]);printf("\n");i=0;while(n!=1){if((count=(float)(n%nr))==0.0){arrayn[i]=nr;i++;n=n/nr;}elsenr++;}for(i=0;i<3;i++)printf("%d ",arrayn[i]);printf("\n");commonzhishu(arraym,arrayn);finish=clock();printf("算法三所需的时间是:%ld秒\n",(finish-start));getchar();printf("是否返回主菜单?(y/n):");key=getchar();switch(key){case 'y':Menu();break;case 'Y':Menu();break;case 'n':break;case 'N':break;default:printf("error!\n");}}void main(){int a;printf("请选择算法:\n");printf("1.算法一\n");printf("2.算法二\n");printf("3.算法三\n");scanf("%d",&a);getchar();switch(a){case 1:algorithmone();break;case 2:algorithmtwo();break;case 3:algorithmthree();break;default:printf("请输入1,2,3中的一个!\n");}}五、实验过程原始记录( 测试数据、图表、计算等)六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

最大公约数实验报告

最大公约数实验报告

最大公约数实验报告
《最大公约数实验报告》
实验目的:通过实验探究最大公约数的概念和求解方法,加深对最大公约数的
理解。

实验材料:纸、铅笔、尺子、计算器
实验步骤:
1. 选取两个整数,例如24和36,用纸和铅笔记录下来。

2. 使用尺子画出24和36的因数分解图。

3. 根据因数分解图,找出24和36的公因数。

4. 比较公因数中的最大值,即为24和36的最大公约数。

实验结果:
24的因数分解为2*2*2*3,36的因数分解为2*2*3*3。

根据因数分解图,24和
36的公因数为1、2、3、6,其中最大值为6,因此24和36的最大公约数为6。

实验分析:
通过实验我们发现,最大公约数是指两个数公有的最大因数,可以通过因数分
解的方法来求解。

在实际运用中,最大公约数可以用于简化分数、约分、比较
大小等问题中。

实验总结:
通过本次实验,我们更加深入地理解了最大公约数的概念和求解方法。

最大公
约数在数学中具有重要的作用,通过实验的方式可以更加直观地理解和应用最
大公约数的知识。

结语:
最大公约数实验为我们提供了一个直观的学习方式,通过实际操作和观察,加深了对最大公约数的理解,为今后的学习打下了坚实的基础。

希望同学们能够通过实验,更加深入地理解和掌握最大公约数的知识。

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

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

《算法分析与设计》实验指导与报告书实验目录实验1 求最大公约数 (1)实验2 斐波那契数列 (3)实验3 最近对问题 (6)实验4 堆排序 (7)实验5 霍纳法则和二进制幂 (8)实验6 字符串匹配问题 (9)实验7 Warshall算法和Floyd算法 (10)实验8 最优二叉查找树 (11)实验9 Huffman编码* (12)实验10 求解非线性方程* (13)实验11 投资问题* (14)注:(1)实验4和实验5为变治法应用,二选一;(2)实验7和实验8为动态规划法应用,二选一;(3)带*号的实验为选做实验,根据课时及学生实验完成情况机动安排。

实验1 求最大公约数{c = a;a = b;b = c;}while(a % b != 0){c = a % b;a = b;b = c;}printf("%d", b);return 0;}连续整数检测算法最大公约数算法:#include <stdio.h>int main(){int a,b,t;printf("Please input two integers: ");scanf("%d %d",&a,&b);if(a<b)t=a;elset=b;while(t>=1){if((a%t==0)&&(b%t==0))break;t--;}printf("%d",t);return 0;}相减循环:#include<stdio.h>int main(){int m,n;printf("Please input two integers: ");scanf("%d%d",&m,&n);while(m!=n)if(m>n) m=m-n;else n=n-m;printf("%d",m);return 0;}教师评分实验2 斐波那契数列实验目的(1)求斐波那契数列;(2)区分递归和递推思想。

《算法设计与分析》课程实验报告

《算法设计与分析》课程实验报告

《算法设计与分析》课程实验报告实验序号:实验项目名称:随机化算法一、实验题目1.N后问题问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后,任何两个皇后不放在同一行同一列,同一斜线上,问有多少种放法。

2.主元素问题问题描述:设A是含有n个元素的数组,如果元素x在A中出现的次数大于n/2,则称x是A的主元素。

给出一个算法,判断A中是否存在主元素。

二、实验目的(1)通过N后问题的实现,体会拉斯维加斯随机算法的随机特点:运行次数随机但有界,找到的解一定为正确解。

但某次运行可能找不到解。

(2)通过实现主元素的不同算法,了解蒙特卡罗算法的随机特性:对于偏真的蒙特卡罗算法,找到为真的解一定是正确解;但非真的解以高概率给出解的正确率------即算法找到的非真解以小概率出现错误。

同时体会确定性算法与随机化算法的差异及各自的优缺点。

(3)通过跳跃表的实现,体会算法设计的运用的广泛性,算法设计的思想及技巧不拘泥独立问题的解决,而在任何需要计算机解决的问题中,都能通过算法设计的技巧(无论是确定性还是随机化算法)来灵巧地解决问题。

此实验表明,通过算法设计技巧与数据组织的有机结合,能够设计出高效的数据结构。

三、实验要求(1)N后问题分别以纯拉斯维加斯算法及拉斯维加斯算法+回溯法混合实现。

要求对同一组测试数据,完成如下任务a.输出纯拉斯维加斯算法找到解的运行次数及运行时间。

b.输出混合算法的stopVegas值及运行时间c.比较a、b的结果并分析N后问题的适用情况。

(2)主元素问题,要求对同一组测试数据,完成如下任务:a.若元素可以比较大小,请实现O(n )的确定性算法,并输出其运行时间。

b.(选做题)若元素不可以比较大小,只能比较相同否,请实现O(n) 确性算法,并输出其运行时间。

c.实现蒙特卡罗算法,并输出其运行次数及时间。

d.比较确定性算法与蒙特卡罗算法的性能,分析每种方法的优缺点。

(3)参照教材实现跳跃表(有序)及基本操作:插入一个结点,删除一个结点。

算法分析与设计课程实验报告

算法分析与设计课程实验报告

算法分析与设计课程实验报告班级: 131213学号: 13121XXX姓名: XXX指导老师:邓凡目录算法分析与设计课程实验报告 (1)实验一排序 (1)1. 课本练习2.3-7 (1)2. 实现优先队列 (2)3.快速排序 (2)4. 第k大元素 (3)实验二动态规划 (4)1. 矩阵链乘 (4)2. 最长公共子序列 (5)3. 最长公共子串 (7)4. 最大和 (9)5. 最短路径 (10)实验三贪心策略 (11)1. 背包问题 (11)2. 任务调度 (14)3. 单源点最短路径 (15)4. 任意两点间最短路径 (16)实验四回溯法 (18)1. 0-1背包问题 (18)2. 8-Queen问题 (21)实验一排序1.课本练习2.3-7(1)问题描述描述一个运行时间为 (nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好是x的元素。

(2)问题分析该问题首先要进行排序,然后用二分查找法判断S中是否存在两个其和刚好是x的元素,因为时间复杂度为(nlgn),所以可以采用归并排序。

(3)算法分析归并排序的思想是将n个元素分成各含n/2个元素的子序列,然后对两个子序列递归地进行排序,最后合并两个已排序的子序列得到排序结果。

二分查找的思想是对于集合中的每一个数字,用二分法找到x-S[i]的位置,若存在且不为其本身,则输出S中存在有两个和等于x的元素;否则,不存在。

(4)实验结果2.实现优先队列(1)问题描述实现优先队列,维护一组元素构成的集合S。

(2)问题分析优先队列是基于堆排序的。

首先将集合S中的元素进行堆排序。

当进行操作时,要不断维护集合S的有序性,即要不断地调整堆。

(3)算法分析本程序中主要的函数有INSERT():需要调用INCREASE_KEY()来维护堆,其时间复杂度为O(lgn),函数MAXIMUM()仅需要返回S[1],时间复杂度为 (1),函数EXTRACT_MAX()需要调用堆排序中的MAX_HEAPIFY,时间复杂度为O(lgn),函数INCREASE_KEY()更新结点到根结点的路径长度为O(lgn),时间复杂度为O(lgn)。

算法分析与设计实验报告

算法分析与设计实验报告

实验报告班级:学号:姓名:总成绩:课程名称:算法分析与设计实训实验项目:1、分治法实验2、动态规划法实验3、贪心法实验4、回溯法实验5、分枝限界法实验计算机学院工业中心202 实验室二〇一〇年 6 月 21 日项目序号 1 项目名称分治法实验成绩小标题找最大值和最小值1、方法思想分治法是把规模大的问题,分割成n个形式相同规模一定或不可再分的子问题,递归地解决每个子问题,再把子问题的结果汇总,合并得到原问题的解。

分治法在每一层递归上由三个步骤组成:(1) 划分(divide):将原问题分解为若干规模较小、相互独立、与原问题形式相同的子问题。

(2) 解决(conquer):若子问题规模较小,则直接求解;否则递归求解各子问题。

(3) 合并(combine):将各子问题的解合并为原问题的解。

2、问题描述我们将分治策略用于此问题,每次将问题分成大致相等的两部分,分别在这两部分中找出最大值与最小值,再将这两个子问题的解组合成原问题的解,就可得到该问题的分治算法。

3、算法描述REC-MAXMIN(i,j,fmax,fmin)1 if i=j2 then fmax ← fmin ← A[i]3 if i=(j-1)4 then if A[i]>A[j]5 then fmax← A[i]6 fmin←A[j]else fmax ←A[j]8 fmin←A[i]9 else mid ←[(i+j)/2]10 REC-MAXMIN(i,mid,gmax,gmin)11 REC-MAXMIN(mid+1,j,hmax,hmin)12 fmax← max{gmax,hmax}13 fmin←min{gmin,hmin}4、程序清单#include<iostream.h>void FZFa(int i,int j,int &max,int &min,int a[]){if(i= =j){max=a[i];min=a[j];}else if(i= =(j-1)){if(a[i]>a[j]){max=a[i];min=a[j];}else{max=a[j];min=a[i];}}else{int midd=(i+j)/2;int max1=0,min1=0,max2=0,min2=0;FZFa(i,midd,max1,min1,a);FZFa(midd+1,j,max2,min2,a);if(max1>max2)max=max1;elsemax=max2;if(min1<min2)min=min1;elsemin=min2;}}int main(){int t[]={2,4};int max,min;FZFa(0,1,max,min,t);cout<<"最大值:"<<max<<endl;cout<<"最小值:"<<min<<endl;return 0;}5、实验结果(可用文字描述和贴图等方式表现实验结果)项目序号 2 项目名称动态规划法实验成绩小标题最长公共子序列1、方法思想动态规划算法与分治法类似,其基本思想也是将待求解问题分成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

算法分析与设计实验报告-最大字段和问题

算法分析与设计实验报告-最大字段和问题

实验报告课程名称算法分析与设计实验项目名称最大字段和问题班级与班级代码实验室名称(或课室)实验楼802 专业:计算机科学与技术任课教师:李绍华学号:姓名:实验日期:2016年11月25日广东财经大学教务处制姓名实验报告成绩评语:指导教师(签名)年月日说明:指导教师评分后,实验报告交院(系)办公室保存。

一、实验目的(1)能够熟悉最大字段和问题这个算法(2)分别使用三种不同算法:暴力算法、分治算法、动态规划算法,体会其算法思想并比较时间复杂度。

二、实验设备硬件: P4 2.0G 1G 内存60G 硬盘以上电脑 软件: C 、C++编程环境,Java 编程环境,windows7三、问题与算法描述1、问题描述给定由n 个整数(可能为负整数)组成的序列a1、a2、……a n ,求该序列形如∑=ji k k a 的字段和的最大值。

当所有整数均为负整数时定义其最大字段和为0。

依次定义,所求的最优值为max{0,max \1n j i <=<=<=∑=jik k a }。

2、算法描述 BF 算法对于起点 i ,遍历所有长度为1,2,…,n-i+1的子区间和,遍历所有的字 段,找出最大字段和。

分治算法求子区间及最大和,从结构上是非常适合分治法的,因为所有子区间 [start, end]只可能有以下三种可能性: 1.在[1, n/2]这个区域内 2.在[n/2+1, n]这个区域内3.起点位于[1,n/2],终点位于[n/2+1,n]内以上三种情形的最大者,即为所求. 前两种情形符合子问题递归特性,所以递归可以求出. 对于第三种情形,则必然包括了n/2和n/2+1两个位置,这样就可以利用第二种穷举的思路分别向左右扩张求出。

动态规划扩展到二维空间令b[j]表示以位置 j 为终点的所有子区间中和最大的一个子问题:如j为终点的最大子区间包含了位置j-1,则以j-1为终点的最大子区间必然包括在其中,如果b[j-1] >0, 那么显然b[j] = b[j-1] + a[j],用之前最大的一个加上a[j]即可,因为a[j]必须包含;如果b[j-1]<=0,那么b[j] = a[j] ,因为既然最大,前面的负数必然不能使你更大。

欧几里得算法实验报告

欧几里得算法实验报告

算法设计与分析基础上机实验报告应用数学学院二零一六年六月实验一欧几里得算法一、实验性质设计二、实验学时14学时三、实验目的1、掌握欧几里得算法。

2、掌握编程语言实现算法的一般流程。

四、实验要求1、用java语言编写出欧几里得算法。

2、计算两个数的最大公约数。

五、实验内容1、如果n=0,返回m的值作为结果,同时过程结束;否则,进入第二步。

2、m除以n,将余数赋给r。

3、将n的值赋给m,将r的值赋给n,返回第一步。

六、实验报告1、伪代码(课本中第3页):算法Euclid(m,n)//使用欧几里得算法计算gcd(m, n)//输入:两个不全为0的非负整数m,n//输出:m, n的最大公约数while n ≠0 dor ←m mod nm ← nn ← rreturn m2、算法程序代码:import java.io.IOException;import java.io.InputStream;import java.util.Scanner;public class E {public static void main(String[] args) {System.out.println("请输入两个不全为0的非负整数");Scanner m1 = new Scanner(System.in);try {int m = m1.nextInt();int n = m1.nextInt();int r = 0;while (n != 0) {r = m % n;m = n;n = r;}System.out.println("m,n的最大公约数为:"+m);} catch (Exception E) { }}}3、运行结果(截图)图(1)图(2)4、算法分析:每经过一次循环,参加运算的两个算子中的后一个都会变得更小,而且绝对不会变成负数。

最终第二个算子的值最终会变成0,此时,算法终止。

c#实验报告计算最小公倍数和最大公约数

c#实验报告计算最小公倍数和最大公约数
uinta, b;
Console.WriteLine("请输入第一个正整数:");
while(!uint.TryParse(Console.ReadLine(),outa)
Console.WriteLine("格式不正确,请重新输入:");
Console.WriteLine("请输入第二个正整数:");
2.创建Windows窗体应用程序
请考书上P8的1.4。
1.编写在控制台中显示消息“欢迎使用C#.NET程序设计”的程序
参考书中的第一章的1.2节。
2.创建Windows窗体应用程序
参考书中的第一章的1.4节。
1.计算最小公倍数和最大公约数。
提示:
(1)创建C#控制台应用程序L1。
(2)在程序主方法中,由用户输入两个正整数a和b,如果输入格式不正确则要求重新输入。参考源代码如下:
{
min--;
}
}
}
}
出现的问题及解决办法
所写的程序没有进入循环,导致结果不对。后来加了while和break语句
c程序设计实验报告实验题目计算最小公倍数和最大公约数实验日期实验环境实验内容与完成情况一实验内容一c程序的开发步骤1
C#
实验题目
计算最小公倍数和最大公约数
实验日期
班级
姓名
学号
实验环境
实验内容与完成情况
一、实验内容
1.在Visual Studio 2008中创建C#控制台应用程序
请参考书上P2的1.2.1。
(4)编译运行程序,通过不同的输入来查看程序输出结果。
(5)在程序中加入计算最大公约数的代码:定义变量i为a和b之间的较小值,并以i为循环变量,使用循环语句求出i到1之间能同时被a和b整除的最大正整数,并输出该最大公约数。

最大公约数实验报告

最大公约数实验报告
start=litmp.QuadPart;
while(t<1000){
m=Random(k-5,k+5);
n=Random(k-5,k+5);
temp=CommFactor(m,n);
t++;
}
QueryPerformanceCounter(&litmp);
over=litmp.QuadPart;
dfMinus=(double)(over-start);
欧几里得算法的时间复杂性O(log N)
假设m>n,函数会按照gcd(m,n)->gcd(n,m%n)->gcd(m%n,n%(m%n))这样递归下去,当n>m/2时有m%n=m-n<m/2,当n<m/2时则m%n<n<m/2,经过两次递归后,第一个参数要小于原来的一半,所以其复杂度应该在O(log max(m,n))以内。
算法设计与分析
实验报告书
实验名称:求两个自然数m和n的最大公约数
学 号:
姓 名:
实验时间:2015年4月1日
一 实验目的和要求
(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;
(2)掌握并应用算法的数学分析和后验分析方法;
(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
using namespace std;
double num;
int CommFactor1(int m,int n)

实现扩展欧几里德算法实验报告

实现扩展欧几里德算法实验报告

实现扩展欧几里德算法求公约数实验报告一、扩展欧几里德算法问题简介对于不完全为0 的非负整数a,b,gcd(a,b)表示a,b 的最大公约数,必然存在整数对x,y ,使得gcd(a,b)=ax+by。

二、扩展欧几里德算法设计方法简介欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。

其计算原理依赖于下面的定理:定理:gcd(a,b) = gcd(b,a mod b)证明:a可以表示成a = kb + r,则r = a mod b假设d是a,b的一个公约数,则有d|a, d|b,而r = a - kb,因此d|r因此d是(b,a mod b)的公约数假设d 是(b,a mod b)的公约数,则d | b , d |r ,但是a = kb +r因此d也是(a,b)的公约数因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证三、程序代码#include <iostream>#include <stdio.h>using namespace std;int x,y,q;void extend_Eulid(int a,int b){if(b == 0){x = 1;y = 0;q = a;}else{extend_Eulid(b,a%b);int temp = x;x = y;y = temp - a/b*y;}}int main(){int a,b;cout<<"请输入a"<<endl;cin>>a;cout<<"请输入b"<<endl;cin>>b;if(a < b){int temp=a;a=b;b=temp;}extend_Eulid(a,b);printf("最大公约数=%d=(%d)*%d+(%d)*%d\n",q,x,a,y,b);return 0;}四、算法介绍扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+by = Gcd(a, b) =d(解一定存在,根据数论中的相关定理)。

求最大公约数和最小公倍数的实验报告

求最大公约数和最小公倍数的实验报告
1.掌握 C 程序中函数的定义和调用方法,理解函数声明的概念和函数声明的方法; 2.掌握文件包含预处理的使用方法; 3.掌握 C 程序中函数嵌套调用的方法; 4.掌握建立和调试多源程序文件程序的方法。
二、实验项目内容(实验题目)
编程实现功能:求 2 个数的最大公约数和最小公倍数。要求一个子函数完成求最 大公约数;另一个函数完成求最小公倍数;然后通过主函数读任意两个正整数,依次 调用两个子函数,最后输出结果。
实验题目 实验 2
函数与 C 程序结构
实验时间 2014-4-24
实验地点
DS1401
实验成绩
实验性质
□验证性 √设计性 □综合性
教师评价:
√算法/实验过程正确; √源程序/实验内容提交 √程序结构/实验步骤合理;
□ 实验结果正确;
□ 语法、语义正确;
□ 报告规范;
其他:
评价教师签名:曹飞
一、实验目的
四、源程序调试过程和(或)实验分析
实验分析总结:在实验过程中,我们需要注意函数的嵌套这一问题,若是 f2 在 f1 的前面,则需要 在 f2 中声明 f1,反之,不需要。同样的,主函数与子函数之间也是如此。还有,形参与实参之间 的联系也值得我们注意。
#include<stdio.h> void main() {int f1(int m,int n);/*对子函数 f1 的声明*/ int f2(int m,int n);/*对子函数 f2 的声明*/ int m,n,num1,num2,r; printf("输入两个正整数:"); scanf("%d,%d",&num1,&num2); if (num1<0||num2<0) printf("不符合题目要求\n");

算法分析与设计求最大公约数问题实验报告

算法分析与设计求最大公约数问题实验报告

算法设计与分析实验报告书实验名称:算法设计与分析之实验一------ 求两个数的最大公约数学号:2012210890姓名:王朔一实验目的和要求(1)复习上课所讲的内容;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

(4)至少设计出三个版本的求最大公约数算法;(5)上机实现算法,并用测算三种算法的运行时间;(6)通过分析对比,得出自己的结论。

二实验内容设计三种算法求两个自然数 m 和 n 的最大公约数,并分析每种算法运行所需时间.三实验环境PCWin7系统, VISUALC++6.0四设计思想及实验步骤1.欧几里得辗转相除算法:①输入两个正整数m,n(m>n);②求出两个数的最大值Max和最小值Min;③计算Max除以Min所得的余数r;④Max=Min,Min=r;⑤若r=0,则m,n的最大公约数等于Max;否则转到②;⑥输出最大公约数Max。

2.蛮力法算法:①输入两个正整数m,n;②令常量factor = 1;循环变量i从2~min(m,n);③如果i是m和n的公因子,则执行④;④factor = factor*i; m = m/i; n = n/i;⑤如果i不是m和n的公因子,则i = i +1;⑥输出factor;3.欧几里得减法算法:①输入两个正整数a,b;②求出两个数的最大值Max和最小值Min;③若Max等于Min,转到⑥;④把Max-Min的差赋予r;⑤如果Min>r,那么把Min赋给Max,把r赋给Min;否则把r赋给Max,执行③;⑥输出最大公约数Min。

测试三种算法,在例举数的范围内产生随机数,且在每个范围内运行1000次,求出所需总时间,最后输出计算每种算法平均执行一次所需的时间。

六核心源代码// 2012210890王朔.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "time.h"#include "windows.h"int CommFactor1(int m,int n);int CommFactor2(int m,int n);int CommFactor3(int m,int n);int main(int argc, char* argv[]){int a[10] ={10000,20000,40000,80000,100000,200000,500000,1000000,2000000,4000000};LARGE_INTEGER BegainTime;LARGE_INTEGER EndTime;LARGE_INTEGER Frequency;QueryPerformanceFrequency(&Frequency);QueryPerformanceCounter(&BegainTime);srand((unsigned)time(NULL));for(int i=0;i<10;i++){for(int j=0;j<1000;j=j+1){double k = (rand()*0.1);long m = (long)(a[i]+k);k = (0.1*rand());long n = (long)(a[i]-k);CommFactor1(m,n);}}QueryPerformanceCounter(&EndTime);printf("算法一总耗时: %.10f 秒\n",(double)(EndTime.QuadPart-BegainTime.QuadPart)/(Frequency.QuadPart*10000));system("pause");return 0;}int CommFactor1(int m, int n){int c = m%n;while(c!=0){m = n;n = c;c= m%n;}return n;}int CommFactor2(int m, int n){int i, factor = 1;for(i = 2; i<= m && i<=n; i++){while(m % i == 0 && n % i == 0){factor = factor*i;m= m/i; n = n/i;}}return factor;}int CommFactor3(int m, int n){ int i,r;if(n>m){i = m;m = n;n = i;}r = m%n;while (r!=0){m = m-n;if(n>m){i = m;m = n;n = i;}r = m%n;}return n;}七实验结果及分析八实验体会(包括本实验中遇到的问题、具体的解决方法、还没有解决的问题、实验收获等)此次实验初步了解了算法分析,三种算法虽然结果相同但是效率却不同。

算法分析实验报告

算法分析实验报告

实验一最大公约数问题//用连续整除法求最大公约数#include<stdio.h>int gcd(int m,int n){int min;if(n>m)min=m;else min=n;for(min=n;min>1;min--){if(m%min==0 && n%min==0)break;}return min;}void main(){int m,n,t;printf("输入两个整数:");scanf("%d %d",&m,&n);t=gcd(m,n);printf("这两个数的最大公约数是:%d\n",t); }//用求欧几里德算法最大公约数#include<stdio.h>int main(){int m,n,t,p;printf("输入两个整数:");scanf("%d %d",&m,&n);if(m>n){t=m;m=n;n=t;}while(p!=0){p=n%m;n=m;m=p;}printf("这两个整数的最大公约数是:%d\n",n); }//用分解质因数法求最大公约数#include<stdio.h>int Gcd(int m,int n){int q=1,i,j,temp;int a_1=1;int a_2=1;int array_1[50],array_2[50];array_1[0]=array_2[0]=1;for(i=2,temp=m;i<=m;i++){if(temp%i==0){array_1[a_1++]=i;temp=temp/i--;}}for(i=2,temp=n;i<=n;i++){if(temp%i==0){array_2[a_2++]=i;temp=temp/i--;}}for(i=0;i<a_1;i++)for(j=0;j<a_2;j++)if(array_1[i]==array_2[j]){q*=array_1[i];array_2[j]=0;break;}return q;}void main(){int a,b,gcd;printf("请输入整数a:");scanf("%d",&a);printf("请输入整数b:");scanf("%d",&b);gcd=Gcd(a,b);printf("最大公约数为:%d\n",gcd);}实验二、最近对问题//用蛮力法求最近对问题#include <iostream>#include <cmath>using namespace std;struct point{double x;double y;};point p[5]={{2,2}, {2,4}, {3,-4}, {8,22}, {6,-5},};double shortest_dis(point p[], int n, point & p1, point & p2){double tmp=10000;for(int i=0;i <n-1; ++i){for(int j=i+1; j <n; ++j){if(sqrt( pow( (p[i].x - p[j].x) ,2 ) + pow( (p[i].y - p[j].y) ,2) ) <tmp) {tmp=sqrt( pow( (p[i].x - p[j].x) ,2 ) + pow( (p[i].y - p[j].y) ,2) );p1=p[i];p2=p[j];}}}return tmp;}void main(){point p1, p2;double dis= shortest_dis(p,5,p1,p2);cout <<"距离最近的2个点的坐标分别是:" <<endl;cout <<"(" <<" " <<p1.x <<"," <<p1.y <<" " <<")" <<" " <<","; cout <<"(" <<" " <<p2.x <<"," <<p2.y <<" " <<")" <<endl;cout <<"最小距离为:" <<dis <<endl;}//用分治法求最近对#include<iostream>#include<algorithm>#include<cmath>using namespace std;typedef struct{float x,y;}POINT;typedef struct{int index;float x, y;}A_POINT;bool compareX(POINT a, POINT b){return b.x>a.x;}bool compareY(A_POINT a, A_POINT b){ return b.y>a.y;}float dist(POINT a, POINT b){float dx, dy;dx = a.x - b.x, dy = a.y - b.y;return (dx*dx+dy*dy);}void closest(POINT X[], A_POINT Y[], int low, int high, POINT &a, POINT &b, float &d){int i,j,k,m;POINT al,bl,ar,br;float dl,dr;if((high-low)==1){a = X[low],b = X[high], d = dist(X[low], X[high]);}else{if((high-low)==2){dl = dist(X[low], X[low+1]);dr = dist(X[low], X[low+2]);d = dist(X[low+1], X[low+2]);if((dl<=dr)&&(dl<=d)){a = X[low],b = X[low+1], d = dl;}else{if(dr<=d){a = X[low],b = X[low+2], d= dr;}else{a = X[low+1],b = X[low+2];}}}else{A_POINT *SL = new A_POINT[(high-low)/2+1];A_POINT *SR = new A_POINT[(high-low)/2];m = (high-low)/2 + low;j = k = 0;for(i=0; i<=high-low; i++){if(Y[i].index<=m){SL[j++] = Y[i];}else{SR[k++] = Y[i];}}closest(X,SL,low, m, al, bl, dl);closest(X,SR,m+1, high, ar, br, dr);if(dl<dr){a = al,b = bl, d = dl;}else{a = ar,b = br, d = dr;}POINT *Z = new POINT[high-low+1];k = 0;for( i=0; i<=high -low; i++){if(fabs(X[m].x - Y[i].x)<d){Z[k].x = Y[i].x, Z[k++].y = Y[i].y;}}for( i=0; i<k; i++){for( j=i+1; (j<k)&&(Z[j].y-Z[i].y<d); j++){dl = dist(Z[i], Z[j]);if(dl<d){a = Z[i],b = Z[j], d = dl;}}}delete SL;delete SR;delete Z;}}}void closest_pair(POINT X[], int n, POINT &a, POINT &b, float &d){ if(n<2){d = 0;}else{sort(X,X+n, compareX);A_POINT *Y = new A_POINT[n];for( int i = 0 ; i < n ;i ++){Y[i].index = i;Y[i].x = X[i].x;Y[i].y = X[i].y;}sort(Y,Y+n, compareY);closest(X,Y,0,n-1,a,b,d);d = sqrt(d);delete Y;}}int main(){int n;cout<<"请输入点个数:";cin>>n;cout<<"请输入各个点的坐标:"<<endl;POINT *X = new POINT[n];for(int i=0; i<n; i++){cin>>X[i].x>>X[i].y;}POINT a,b;float d;closest_pair(X,n,a,b,d);if(n>=2){printf("这两个点是:(%.2f,%.2f) (%.2f,%.2f)\n最近距离是:%.2f\n", a.x, a.y, b.x, b.y, d);}else{printf("不存在最近点对!\n");}delete X;return 0;}实验三、求最长公共子序列//用动态规划法求最大公共子序列#include <stdio.h>#include <string.h>#include <stdlib.h>void prt_lcs(int, int, char [], int**);int main(int argc, char* argv[]){char x[100], y[100];int i, j, m, n, ** a, ** b;printf("输入第一个字符串:");gets(x);printf("输入第二个字符串:");gets(y);m = strlen(x) + 1;n = strlen(y) + 1;if (((a = (int**)malloc(m * sizeof(int*))) == NULL) || ((b = (int**)\ malloc(m * sizeof(int*))) == NULL)) {printf("There is no enough memory!\n");exit(1);}for (i = 0; i < m; i ++)if (((a[i] = (int*)malloc(n * sizeof(int))) == NULL) || ((b[i] = \(int*)malloc(n * sizeof(int))) == NULL)) {printf("There is no enough memory!\n");exit(2);}for (i = 0; i < m; i ++) a[i][0] = 0;for (i = 0; i < n; i ++) a[0][i] = 0;for (i = 1; i < m; i ++)for (j = 1; j < n; j ++)if (x[i - 1] == y[j - 1]) {a[i][j] = a[i - 1][j - 1] + 1;b[i][j] = 1;} else if (a[i - 1][j] >= a[i][j - 1]) {a[i][j] = a[i - 1][j];b[i][j] = 2;} else {a[i][j] = a[i][j - 1];b[i][j] = 3;}printf("最大公共子序列是:");prt_lcs(m - 1, n - 1, x, b);printf("\n");for (i = 0; i < m; i ++) {free(a[i]);free(b[i]);}free(a);free(b);return 0;}void prt_lcs(int i, int j, char x[], int** b) {if (i < 0 || j < 0) return;if (b[i][j] == 1) {prt_lcs(i - 1, j - 1, x, b);printf("%c", x[i - 1]);} else if (b[i][j] == 2)prt_lcs(i - 1, j, x, b);elseprt_lcs(i, j - 1, x, b);}实验四、最大子段和问题//用蛮力法求最大子段和#include <stdio.h>int ManLifa(int a[],int n){int i=0;int Max[]={0,0,0,0,0,0,0,0,0,0};int MaxZD=0;for(int j=0;j<n;j++){int max=0, sum=0;for(i=j;i<n;i++){sum=sum+a[i];if(sum>max) max=sum;}Max[j]=max;max=0;sum=0;}for(i=0;i<n;i++){if(Max[i]>MaxZD)MaxZD=Max[i];}if(MaxZD>0)return MaxZD;return 0;}void main(){int a[6],i;printf("输入六个整数:");for(i=0;i<=5;i++){scanf("%d",&a[i]);}printf("最大子段的值是%d\n",ManLifa(a,6));//用分治法求最大子段和#include<stdio.h>int MaxSum(int a[],int left,int right) {int i,sum=0;if(left==right)sum=a[left]>0?a[left]:0;else{int center=(left+right)/2;int leftsum=MaxSum(a,left,center);int rightsum=MaxSum(a,center+1,right); int s1=0,s2=0,lefts=0,rights=0;for(i=center;i>=left;i--){lefts+=a[i];if(lefts>s1)s1=lefts;}for(i=center+1;i<=right;i++){rights+=a[i];if(rights>s2)s2=rights;}sum=s1+s2;if(sum<leftsum) sum=leftsum;if(sum<rightsum) sum=rightsum; }return sum;}void main(){int i,s=0;int a[6];printf("输入六个整数:");for(i=0;i<6;i++)scanf("%d",&a[i]);s=MaxSum(a,1,6);printf("最大子段的和为:%d\n",s); }//用动态规划法求最大子段和#include<stdio.h>int MaxSum(int n,int a[]) {int i,sum=0,b=0;for(i=1;i<=n;i++){if(b>0)b+=a[i];elseb=a[i];if(b>sum)sum=b;}return sum;}void main(){int i,s=0;int a[6];printf("请输入六个整数:");for(i=0;i<6;i++)scanf("%d",&a[i]);s=MaxSum(6,a);printf("最大子段和是:%d\n",s); }实验五、0/1背包问题//用分治法求0/1背包问题#include<stdio.h>int m[10][100];int w[10];int knapsack(int a,int b){int i,j,v[10];printf("请输入每一个物品的重量和价值:\n");for(i=1;i<b+1;i++)scanf("\n%d,%d",&w[i],&v[i]);for(i=0;i<10;i++)for(j=0;j<100;j++)m[i][j]=0;for(i=b;i>0;i--)for(j=1;j<a+1;j++){if(w[i]<=j){if(v[i]+m[i+1][j-w[i]]>m[i+1][j])m[i][j]=v[i]+m[i+1][j-w[i]];elsem[i][j]=m[i+1][j];}else m[i][j]=m[i+1][j];}return(m[1][a]);}void main(){int a,b;int i,j;printf("请输入背包容量和物品数:");scanf("%d,%d",&a,&b);printf("\n最大价值是:%d",knapsack(a,b));printf("\n");}//用贪心法求0/1背包问题#include <iostream.h>struct goodinfo{float p;float w;float X;int flag;};void Insertionsort(goodinfo goods[],int n) {int j,i;for(j=2;j<=n;j++){goods[0]=goods[j];i=j-1;while (goods[0].p>goods[i].p){goods[i+1]=goods[i];i--;}goods[i+1]=goods[0];}}void bag(goodinfo goods[],float M,int n) {float cu;int i,j;for(i=1;i<=n;i++)goods[i].X=0;cu=M;for(i=1;i<n;i++){if(goods[i].w>cu)break;goods[i].X=1;cu=cu-goods[i].w;}if(i<=n)goods[i].X=cu/goods[i].w;for(j=2;j<=n;j++){goods[0]=goods[j];i=j-1;while (goods[0].flag<goods[i].flag) {goods[i+1]=goods[i];i--;}goods[i+1]=goods[0];}cout<<"最优解为:"<<endl;for(i=1;i<=n;i++){cout<<"第"<<i<<"件物品要放:"; cout<<goods[i].X<<endl;}}void main(){int j;int n;float M;goodinfo *goods;while(j){cout<<"请输入物品的总数量:";cin>>n;goods=new struct goodinfo [n+1];cout<<"请输入背包的最大容量:"; cin>>M;cout<<endl;int i;for(i=1;i<=n;i++){ goods[i].flag=i;cout<<"请输入第"<<i<<"件物品的重量:";cin>>goods[i].w;cout<<"请输入第"<<i<<"件物品的效益:";cin>>goods[i].p;goods[i].p=goods[i].p/goods[i].w;cout<<endl;}Insertionsort(goods,n);bag(goods,M,n);cout<<"press <1> to run agian"<<endl;cout<<"press <0> to exit"<<endl;cin>>j;}}//用回溯法求0/1背包问题#include<iostream>using namespace std;class Knap{friend int Knapsack(int p[],int w[],int c,int n ); public:void print(){for(int m=1;m<=n;m++){cout<<bestx[m]<<" ";}cout<<endl;};private:int Bound(int i);void Backtrack(int i);int c;//背包容量int n; //物品数int *w;//物品重量数组int *p;//物品价值数组int cw;//当前重量int cp;//当前价值int bestp;//当前最优值int *bestx;//当前最优解int *x;//当前解};int Knap::Bound(int i){int cleft=c-cw;int b=cp;while(i<=n&&w[i]<=cleft){cleft-=w[i];b+=p[i];i++;}if(i<=n)b+=p[i]/w[i]*cleft;return b;}void Knap::Backtrack(int i){if(i>n){if(bestp<cp){ cout<<"最优解为"<<endl;for(int j=1;j<=n;j++)bestx[j]=x[j];bestp=cp;}return;}if(cw+w[i]<=c) //搜索左子树{x[i]=1;cw+=w[i];cp+=p[i];Backtrack(i+1);cw-=w[i];cp-=p[i];}if(Bound(i+1)>bestp)//搜索右子树{x[i]=0;Backtrack(i+1);}}class Object{friend int Knapsack(int p[],int w[],int c,int n); public:int operator<=(Object a)const{return (d>=a.d);}private:int ID;float d;};int Knapsack(int p[],int w[],int c,int n){int W=0;int P=0;int i=1;Object *Q=new Object[n];for(i=1;i<=n;i++){Q[i-1].ID=i;Q[i-1].d=1.0*p[i]/w[i];P+=p[i];W+=w[i];}if(W<=c)return P;float f;for( i=0;i<n;i++)for(int j=i;j<n;j++){if(Q[i].d<Q[j].d){f=Q[i].d;Q[i].d=Q[j].d;Q[j].d=f;}}Knap K;K.p = new int[n+1];K.w = new int[n+1];K.x = new int[n+1];K.bestx = new int[n+1];K.x[0]=0;K.bestx[0]=0;for( i=1;i<=n;i++){K.p[i]=p[Q[i-1].ID];K.w[i]=w[Q[i-1].ID];}K.cp=0;K.cw=0;K.c=c;K.n=n;K.bestp=0;//回溯搜索K.Backtrack(1);K.print();delete [] Q;delete [] K.w;delete [] K.p;return K.bestp;}void main(){int *p;int *w;int c=0;int n=0;int i=0;cout<<"请输入物品的个数:"<<endl;cin>>n;p=new int[n+1];w=new int[n+1];p[0]=0;w[0]=0;cout<<"请输入物品的价值:"<<endl;for(i=1;i<=n;i++)cin>>p[i];cout<<"请输入物品的重量:"<<endl;for(i=1;i<=n;i++)cin>>w[i];cout<<"请输入背包容量:"<<endl;cin>>c;cout<<Knapsack(p,w,c,n)<<endl;}实验六、八皇后问题//用回溯法求八皇后问题#include <conio.h>#include <iostream>using namespace std;static const int MAX = 8;int sum = 0;class QueenPuzzle {int queens[MAX];public:void printOut();bool isValid(int n);void placeQueen(int i);};void QueenPuzzle::printOut() {for(int i = 0; i < MAX; i++) {for(int j = 0; j < MAX; j++) {if(queens[i] == j) {cout<<"H ";}else cout<<"0 ";}cout<<endl;}cout<<endl<<"按q键退出,按其他键显示下一个解!"<<endl; if(getch() == 'q')exit(0);}void QueenPuzzle::placeQueen(int i) {for(int j = 0; j < MAX; j++) {if(i == MAX) {cout<<"第"<<++sum<<"个解为:"<<endl<<endl;printOut();cout<<endl;return;}queens[i] = j;if(isValid(i)) {placeQueen(i + 1);}}}bool QueenPuzzle::isValid(int n) {for(int i = 0; i < n; i++) {if(queens[i] == queens[n])return false;if(abs(queens[i] - queens[n]) == n - i)return false;}return true;}int main() {QueenPuzzle qp;qp.placeQueen(0);cout<<"总共有"<<sum<<"组解!"<<endl; return 0;}。

算法试验一_求最大公约数实验报告_

算法试验一_求最大公约数实验报告_

算法试验一_求最大公约数实验报告昆明理工大学信息工程与自动化学院学生实验报告(2019 —2019 学年第1 学期)课程名称:算法设计与分析开课实验室:信自楼应用、网络机房445 2019 年10月25 日一、上机目的及内容1. 上机内容求两个自然数m 和n 的最大公约数。

2. 上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O 符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。

三、所用仪器、材料(设备名称、型号、规格等或使用软件)1 台PC 及VISUAL C++6.0 软件四、实验方法、步骤(或:程序代码或操作过程)算法一算法描述:① 输入m 和n ;②求m 除以n 的余数r ;③若r 等于0 ,则n 为最大公约数,算法结束;否则执行第④步;④将n 的值放在m 中,将r 的值放在n 中;⑤ 重新执行第②步。

连续整数检测算法描述各个算法时间复杂度和运算速度:算法一运算速度为O(n2) ,其中n 为输入数值的位数。

算法二时间复杂度:T(n)=O(n); 基本语句执行次数C(n)=n; 算法三时间复杂度T(n)=O(n)五、实验过程原始记录( 测试数据、图表、计算等)程序代码:#include int wanghui(int m, int n) {int r=m % n;while (r!=0) { m=n; n=r; r=m % n; } return n; }void main( ) {cout}2 丶#include int gcd(int m,int n) {int t=(m>n?n:m); while(m%t!=0 ||n%t!=0) {if(m%t==0) {if(n%t==0) return t; else t=t-1; } else t=t-1; }printf("%d\n",t); }void main() {int m,n; scanf("%d",&m);scanf("%d",&n); gcd(m,n);}3 丶欧几里得算法的减法版本#include int wanghui3(int m,int n) {while(n!=m) {if(m>n)m=m-n; else n=n-m; }return m; }void main() {int a,b; cin>>a>>b;cout}六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法分析与设计求最大公约数问题实
验报告
算法设计与分析
实验报告书
实验名称:算法设计与分析之实验一 ------ 求两个数的最大公约数
学号: 210890
姓名:王朔
一实验目的和要求
(1)复习上课所讲的内容;
(2)掌握并应用算法的数学分析和后验分析方法;
(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

(4)至少设计出三个版本的求最大公约数算法;
(5)上机实现算法,并用测算三种算法的运行时间;
(6)经过分析对比,得出自己的结论。

二实验内容
设计三种算法求两个自然数 m 和 n 的最大公约数,并分析每种算法运行所需时间.
三实验环境
PCWin7系统 , VISUALC++6.0
四设计思想及实验步骤
1.欧几里得辗转相除算法:
①输入两个正整数m,n(m>n);
②求出两个数的最大值Max和最小值Min;
③计算Max除以Min所得的余数r;
④Max=Min,Min=r;
⑤若r=0,则m,n的最大公约数等于Max;否则转到②;
⑥输出最大公约数Max。

2.蛮力法算法:
①输入两个正整数m,n;
②令常量factor = 1;循环变量i从2~min(m,n);
③如果i是m和n的公因子,则执行④;
④factor = factor*i; m = m/i; n = n/i;
⑤如果i不是m和n的公因子,则i = i +1;
⑥输出factor;
3.欧几里得减法算法:
①输入两个正整数a,b;
②求出两个数的最大值Max和最小值Min;
③若Max等于Min,转到⑥;
④把Max-Min的差赋予r;
⑤如果Min>r,那么把Min赋给Max,把r赋给Min;否则把r赋给Max,执行③;
⑥输出最大公约数Min。

测试三种算法,在例举数的范围内产生随机数,且在每个范围内运行1000次,求出所需总时间,最后输出计算每种算法平均执行一次所需的时间。

六核心源代码
// 210890王朔.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "windows.h"
int CommFactor1(int m,int n);
int CommFactor2(int m,int n);
int CommFactor3(int m,int n);
int main(int argc, char* argv[])。

相关文档
最新文档