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

上传人:b****2 文档编号:1645658 上传时间:2022-10-23 格式:DOC 页数:7 大小:60KB
下载 相关 举报
算法分析与设计求最大公约数问题实验报告.doc_第1页
第1页 / 共7页
算法分析与设计求最大公约数问题实验报告.doc_第2页
第2页 / 共7页
算法分析与设计求最大公约数问题实验报告.doc_第3页
第3页 / 共7页
算法分析与设计求最大公约数问题实验报告.doc_第4页
第4页 / 共7页
算法分析与设计求最大公约数问题实验报告.doc_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

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

《算法分析与设计求最大公约数问题实验报告.doc》由会员分享,可在线阅读,更多相关《算法分析与设计求最大公约数问题实验报告.doc(7页珍藏版)》请在冰豆网上搜索。

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

算法设计与分析

实验报告书

实验名称:

算法设计与分析之实验一

------求两个数的最大公约数

学号:

2012210890

姓名:

王朔

评语:

成绩:

指导教师:

批阅时间:

年月日

《算法分析与设计》实验报告 -6-

一实验目的和要求

(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:

Definestheentrypointfortheconsoleapplication.

//

#include"stdafx.h"

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

#include"windows.h"

intCommFactor1(intm,intn);

intCommFactor2(intm,intn);

intCommFactor3(intm,intn);

intmain(intargc,char*argv[])

{

inta[10]={10000,20000,40000,80000,100000,200000,500000,1000000,2000000,4000000};

LARGE_INTEGERBegainTime;

LARGE_INTEGEREndTime;

LARGE_INTEGERFrequency;

QueryPerformanceFrequency(&Frequency);

QueryPerformanceCounter(&BegainTime);

srand((unsigned)time(NULL));

for(inti=0;i<10;i++)

{

for(intj=0;j<1000;j=j+1){

doublek=(rand()*0.1);

longm=(long)(a[i]+k);

k=(0.1*rand());

longn=(long)(a[i]-k);

CommFactor1(m,n);

}

}

QueryPerformanceCounter(&EndTime);

printf("算法一总耗时:

%.10f秒\n",(double)(EndTime.QuadPart-BegainTime.QuadPart)/(Frequency.QuadPart*10000));

system("pause");

return0;

}

intCommFactor1(intm,intn){

intc=m%n;

while(c!

=0){

m=n;

n=c;

c=m%n;

}

returnn;

}

intCommFactor2(intm,intn){

inti,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;

}

}

returnfactor;

}

intCommFactor3(intm,intn){

inti,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;

}

returnn;

}

七实验结果及分析

三种算法

算法运行时间

欧几里得辗转相除法时间(ms)

蛮力法时间(ms)

欧几里得减法时间(ms)

平均使用时间(ms)

0.0008929

3.9237605

0.0041045

八实验体会(包括本实验中遇到的问题、具体的解决方法、还没有解决的问题、实验收获等) 

此次实验初步了解了算法分析,三种算法虽然结果相同但是效率却不同。

对于复杂度的求解,可以根据我的结果分析得到欧几里得辗转相除算法的是最优算法,欧几里得减法其次,最复杂的是蛮力法。

在实验中,对于使用产生随机数测试算法的问题有了新的认识和了解,并学会了使用时间测试函数.

从这次实验中,我复习了C语言代码,同时也通过算法分析用三种方法求解出了最大公约数这个问题。

从这个试验的结果我了解到了算法的优与劣的差别,虽然得到的是同样的结果,但是需要的时间和资源却相差很大,这提示我们在以后写算法的时候要找出最优算法。

可见算法分析与设计课程的对计编程的人来说是多么的重要,在以后写程序过程中要时刻提醒自己找最优算法,当然得先学会O(n)的分析。

在以后的学习中我要学会多实践、多分析,在不停的改正错误中提高自己。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1