最大公约数三种办法计数器流程图.docx
《最大公约数三种办法计数器流程图.docx》由会员分享,可在线阅读,更多相关《最大公约数三种办法计数器流程图.docx(10页珍藏版)》请在冰豆网上搜索。
最大公约数三种办法计数器流程图
昆明理工大学信息工程与自动化学院学生实验报告
)1学期2013学年第(2012—日10月18开课实验室:
2012年
课程名称:
算法设计与分析442信自楼机房
实验项目名称
N
m%i=0丫Nn%i=0i=i+1丫
丫r=0
N
m=n
n=r
求最大公约数开始开始
指导教师
吴晟
教师评语
该同学是否了解实验原理:
A.了解口C.不了解口B.基本了解口A.强口C.差□该同学
的实验能力:
B.中等口未达到口该同学的实验是否达到要求:
达到口A.C.B.基本达到口
C.不规范口实验报告是否规范:
B.基本规范口A.规范口没有C.一般详细口A.□□实
验过程是否详细记录:
B.教师签名:
日年月输入m和n
c=(m>n?
m:
n)nm输入和
r=m%n
一、上机目的及内容1.上机内容的最大公约数。
n求两个自然数m和上机目的2.)复习数据结构课程的相关知识,实现课程间的平滑过渡;
(1)掌握并应用算法的数学分析和后验分析方法;
(2)理解这样一个观点:
不同的算法能够解决相同的问题,这些算法的解题思路不同,复
杂程度不3(同,解题效率也不同。
二、实验原理及基本技术路线图(方框原理图或程序流程图)1)至少设计岀三个版本的求最
大公约数算法;(符号进行时间复杂性分析;2)对所设计的算法采用大0(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;()通过分析对比,得岀自己的结论。
(4
连续整数检测算法流程图:
//
k=i输出
结束
连续整数检测算法
时间复杂度T(n)=0(Iog2(n))
-2-
欧几里得算法流程图:
n
输出
结束
:
T(n)=0(n/2)
时间复杂度欧几里得算法
-3-
分解因式算法图
开始
输入
Y
Na[10],b[10],s,t=2,i=0,all,i1,i2;
m=m/t;a[i]=t,.i++
Yall=all*a[i1]
N
t++
NY
s=n%t
YYs==0NN
n和m
m=1||n=1
s=m%t
s==Om==all
n=n/t;b[i]=t;i++;all=1for(i2=0;i2
n==all
Y
all=1//利用循环,求岀公共质因数for(int
s1=0;s1{for(ints2=0;s2all=all*a[s1];
-4-
couvvallvvendl;
结束
分解因式时间复杂度:
T(n)=0(n/2)+O(log2(n)
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
1台PC及VISUALC++6.0软件
四、实验方法、步骤(或:
程序代码或操作过程)
#includestdio.h
#include
#include
#include
#include
intjishiqi_0();
intjishiqi_1();
intjishiqi_2();
intjishiqi_3();
floatnow,t0,t1,t2,t3;
usingnamespacestd;
intm,n,c,k;
//
intjishiqi_0()//输入时延长的多余时间
{
inti,j;
for(i=1;i<=10000;i++)
for(j=1;j<=20000;j++);
t0=(clock()-now)/CLOCKS_PER_SEC;
return0;
}
//
-5-
intjishiqi_1()//分解因式算法所用时间
{
inti,j;
for(i=1;i<=10000;i++)
for(j=1;j<=20000;j++);
t1=(clock()-now)/CLOCKS_PER_SEC-t0;
牰湩晴尨分解因式算法所用时间为:
%fms\n,t1);
return0;
}
//
intjishiqi_2()//欧几里得算法所用时间
{
inti,j;
for(i=1;i<=10000;i++)
for(j=1;j<=20000;j++);
t3=(clock()-now)/CLOCKS_PER_SEC-t0-t1-t2;
牰湩晴尨欧几里得算法所用时间为:
%fms\n,t3);
return0;
}
//
intjishiqi_3()//连续检测算法所用时间{
inti,j;
for(i=1;i<=10000;i++)
for(j=1;j<=20000;j++);
t2=(clock()-now)/CLOCKS_PER_SEC-t1-t0;牰湩晴尨连续检测算法所用时间为:
%fms\n,t2);
return0;
}
//==================================================intLX(intm,intn)//连续整数检测
-6-
{
jishiqi_3();
intk;
intc=0;c=(m>n?
m:
n);
for(inti=1;i<=c;i++)
{
if(m%i==0&&n%i==0)k=i;
else
continue;
}
returnk;
}
//
intOJ(intm,intn)//欧几里得算法
{
jishiqi_2();
intr;
r=m%n;while(r!
=0){m=n;
n=r;
r=m%n;
}
returnn;
}
//
分解质因数法intFJ(intm,intn)//{
jishiqi_1();if(m==1||n==1){
1<最大公约数为:
}
inta[10],b[10],s,t=2,i=0,all,m1,n1,i1,i2;
m1=m;
n1=n;
-7-
cout<while
(1){
s=m1%t;//求m1除以t(t为2)的余数s
t为质因数其中之一
if(s==0){//如果s为0,说明可以整除,则进行下面操作,记录
m1=m1/t;
a[i]=t;//把t摆在数组a[]中
cout<i++;t=2;all=1;for(i1=0;i1
}
if(m==all)break;//判断该整数的质因数是否全部求出
cout<<*;
}elset++;
}
i=0;//把i重置为0,进行整数n的求质因数
cout<cout<while
(1){
s=n1%t;if(s==0){n1=n1/t;b[i]=t;cout<for(i2=0;i2
}if(n==all)break;cout<<*;
}elset++;
}
cout<for(ints1=0;s1for(ints2=0;s2-8-all=all*a[s1];
b[s2]=0;//已经配对的质因数被清0,避免出现重复性的错误!
break;
}
}
}
潣瑵?
最大公约数为:
<return0;
}
//
intmain()//主函数
{
charc;
while
(1)
{cout<<=====================================================<cout<<1、分解质因数法连续整数检测法欧几里得算法<cout<<=====================================================<cin>>c;switch(c)
{
case'1':
潣瑵?
请分别输入两个整数<cin>>m>>n;
FJ(m,n);
潣瑵?
最大公约数为:
<最大公约数为:
<break;default:
潣瑵?
请重新输入!
<break;
}
}
return0;
}
-9-
五、实验过程原始记录(测试数据、图表、计算等)请给岀各个操作步骤的截图和说明;
-10-
-11-
六:
实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)
得出:
我们从前面的时间复杂度T(n)])log2(n)[0(n/2)+O«(0(n/2)《Olog2(n)
(欧几里得算法的是最优算法,其次是连续整除法,最复杂的是分解质因数算法。
再从代码运行的计数器和计算的时间来看结果恰好和前面的复杂度得到的结果一致,所以得出结论-12-
欧几里得算法最优。
通过对三种计算最大公约数方法的比较解了算法设计的初
步概念并对求公约数问题有了更深的认识。
了解到了算法的优与劣的差别,虽然
得到的是同样的结果,但是,需要的时间和资源却相差很大这提示我们在以后写算法的时候要找出最优算法。
也告诉了我们算法对于一个程序的重要性,我们要对这门课产生足够的重视。
分解因式算法由于比较复杂,本人并不会,是从网
上copy下来的。
本程序在计时器上还有待改进。
注:
教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。