算法设计与分析第一章习题1-1到1-3

1-1什么是算法?它与计算过程和程序有什么区别

 算法是处理问题的思路,程序语言是按照一定语法表达出来,
 
 打个比方,你头脑里有了一套新思想,一个新发现,你可以用中文写出来,也可以用英文写出来,让大家明白。思想和发现可以比作是算法,用中文或英文可以比作是程序语言。

 因此核心是算法,但程序语言是实现算法的载体。在计算机等系统中,算法是处理某一问题的思路方法,而程序语言能具体表达算法从而使之运行起来通过算法需要完成的任务。

1-2程序证明和程序测试的目的各是什么

程序证明是为了证明程序的正确性

程序测试(Test)的目的是发现程序中的错误,并且争取能发现尽可能多的错误。程序调试(Debug)则包括定位和纠正错误。程序正确性证明目前还是理论研究的课题,对大型程序,证明其正确性还做不到。正如医生的任务是诊断与治疗疾病,并不是证明某人没有病。

1-3 算法速度比较

为了计算欧几里的递归算法和欧几里的迭代算法,首先得用到计算时间的time.h文件。

C++中的计时函数是clock(),而与其相关的数据类型是clock_t(头文件是time.h)。函数定义原型为:clock_t clock(void);

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。
在time.h中可以找到用来保存时间的clock_t数据类型:

#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

从typedef long clock_t可以看出是一个长整形数,其中time.h中还定义了一个

#define CLOCKS_PER_SEC  1000

它用来表示一秒钟会有多少个时钟计时单元,因此,我们就使用公式clock()/CLOCKS_PER_SEC计算一个进程自身运行的时间

首先计算欧几里得算迭代算法的时间
最终代码如下:

// Test1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <time.h>



int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}
using namespace std;
void Swap(int &a,int &b);
int RGcd(int m, int n);
int Gcd(int m,int n);
int l_2Gcd(int m,int n);
int l_3Gcd(int m,int n);
int main()
{
	clock_t start,finshi,start1,finshi1; 
	double totaltime,totaltime1;
	int times;
	int greatest_common_divisor,greatest_common_divisor1;
	//欧几里得迭代算法
	start = clock();
	greatest_common_divisor = l_2Gcd(14142,31415);
	finshi = clock();
	totaltime = (double)(finshi - start)/CLOCKS_PER_SEC;
	//欧几里得连续整数检测算法
	start1 = clock();
	greatest_common_divisor1 = l_3Gcd(14142,31415);
	finshi1 = clock();
	totaltime1 = (double)(finshi1 - start1)/CLOCKS_PER_SEC;
	//计算倍数
	times = (int)(totaltime1/totaltime);
	cout<<"欧几里的迭代算法的速度是欧几里得连续整数检测算法";
	printf("%d倍",times);
}
void Swap(int &a,int &b){

	int c = a; a = b; b = c;
}

int RGcd(int m, int n){
	if(m==0) return n;
	return RGcd(n%m,m);
}

int Gcd(int m,int n){

	if(m>n)Swap(m,n);
	return RGcd(m, n);
}

int l_2Gcd(int m,int n){
	if(m == 0)return n;if(n == 0)return m;
	if(m>n) Swap(m, n);
	while(m>0){
		int c = n%m;n = m;m = c;
	}
	return n;
}
int l_3Gcd(int m,int n){
	if(m==0) return n;if(n==0) return m;
	int t = m>n?n:m;
	while(m%t||n%t) t--;
	return t;
}

最终结果。。。经过调试得到的是几乎无穷,后面调试看了下发现是两个个算法都特别快,造成了0/0的局面,所以根据循环次数来计算(所以我是在瞎折腾些什么)
l_2Gcd中的函数while循环为10次
l_3Gcd中的函数while循环为1414次
所以大概是1414倍

猜你喜欢

转载自blog.csdn.net/xiaomaotian/article/details/107535648