Algorithm in C(2): 多种 Euclid's algorithm 实现的比较

上篇 Algorithm in C(1) 中,只是实现了减法来求GCD的实现,下面的例子中使用三种方法来实现求GCD,并且加入了时间测定方法。

原例子取自韩文的《通过C语言学习算法》,原例是在Windows下实现的代码,我将它稍微改动了一下,以适用我的Linux系统。


ContractedBlock.gif ExpandedBlockStart.gif Code
/*  Implementation of Euclid's algorithm1 */
/*      Programmed by Lee jaekyu          */
/*        Modified by Jin rize            */

#include 
<stdio.h>
#include 
<sys/time.h>
//作10万次运算
#define LOOP 100000

//linux下的时间测定方法
long timecacul () {
        
struct timeval tv;
        
struct timezone tz;
        gettimeofday(
&tv,&tz);
        
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}

//使用减法
int gcd_minus(int u, int v)
{
    
int t;
    
while(u)
    {
        
if (u<v)
        {
            t
=u; u=v; v=t;
        }
        u
=u-v;
    }
    
return v;
}

//使用取余
int gcd_modulus (int u, int v)
{
    
int t;
    
while(v)
    {
        t
=u%v;
        u
=v;
        v
=t;
    }
    
return u;
}

//使用递归
int gcd_recursion(int u, int v)
{
    
if (v==0)
        
return u;
    
else
        
return gcd_recursion(v, u%v);
}


void main(void)
{
    
int u,v, gcd;
    
long starttime, endtime;
    
int i;

    puts (
"\n EUCLID : Get GCD with time checking"
          
"\n     Input 0 to end program ");

    
while(1)
    {
        puts (
"\n Iput two positive integer  ");
        scanf(
"%d %d"&u,&v);

        
if (u<0 ||v<0)
            
continue;
        
if (u==0 || v==0)
            
break;

    
//测定时间
    starttime=timecacul();
    
for (i=0; i<LOOP; i++)
        gcd
=gcd_minus(u,v);
    endtime
=timecacul();
    printf(
"\n Minus methods : GCD of %d and %d is %d. in %ld ms.", u, v, gcd, endtime-starttime);

    starttime
=timecacul();
    
for (i=0; i<LOOP; i++)
        gcd
=gcd_modulus(u,v);
    endtime
=timecacul();
    printf(
"\n Modulus methods : GCD of %d and %d is %d. in %ld ms.", u, v, gcd, endtime-starttime);

    starttime
=timecacul();
    
for (i=0; i<LOOP; i++)
        gcd
=gcd_recursion(u,v);
    endtime
=timecacul();
    printf(
"\n Recursion methods : GCD of %d and %d is %d. in %ld ms.", u, v, gcd, endtime-starttime);
    }
}

 

运行结果如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
 EUCLID : Get GCD with time checking
     Input 
0 to end program 

 Iput two positive integer 
 
280 30

 Minus methods 
: GCD of 280 and 30 is 10. in 6 ms.
 Modulus methods 
: GCD of 280 and 30 is 10. in 3 ms.
 Recursion methods 
: GCD of 280 and 30 is 10. in 3 ms.
 Iput two positive integer 
 
12 9

 Minus methods 
: GCD of 12 and 9 is 3. in 3 ms.
 Modulus methods 
: GCD of 12 and 9 is 3. in 2 ms.
 Recursion methods 
: GCD of 12 and 9 is 3. in 3 ms.
 Iput two positive integer 
 
2980 20

 Minus methods 
: GCD of 2980 and 20 is 20. in 64 ms.
 Modulus methods 
: GCD of 2980 and 20 is 20. in 1 ms.
 Recursion methods 
: GCD of 2980 and 20 is 20. in 2 ms.
 Iput two positive integer 
 

 

 翻译一下作者的原话:

280, 30 的情况:

 取余算法最快,算法相同的情况下,递归实现稍慢(在我的运行结果中是一样的,怪我机子还不错。)

12, 9的情况:

因为两个数太接近,需要进行的减法运算也少,所以数字都比较接近。

2980, 20的情况:

要做接近150次的减法运算,所以利用减法的算法耗时最长,取余算法则显示出了优越性

 

转载于:https://www.cnblogs.com/jinrize/archive/2009/10/27/1590738.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《算法:C语言实现(第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)》细腻讲解计算机算法的C语言实现。全书分为四部分,共16章。包括基本算法分析原理,基本数据结构、抽象数据结构、递归和树等数据结构知识,选择排序、插入排序、冒泡排序、希尔排序、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,并比较了各种排序方法的性能特征,在进一步讲解符号表、树等抽象数据类型的基础上,重点讨论散列方法、基数搜索以及外部搜索方法。书中提供了用C语言描述的完整算法源程序,并且配有丰富的插图和练习,还包含大量简洁的实现将理论和实践成功地相结合,这些实现均可用在真实应用上。 《算法:C语言实现(第5部分)图算法(原书第3版)》是深入论述算法的三卷本教程《算法:C语言实现》(第3版)中的第二卷——图算法。作者在这次修订中重写了许多内容,增加了数千个新练习、数百个新图表、数十个新程序,并对图表和程序做了详尽的注释说明。新版中不仅涵盖了新的主题,而且还提供了对许多经典算法的更充分的解释,包括图的性质、图搜索、有向图、最小生成树、最短路径和网。《算法:C语言实现(第5部分)图算法(原书第3版)》涵盖了足够的基本内容及较详细的图算法高级主题,既可单独用作数据结构与算法课程的教材,也可与第一卷(第1~4部分)结合使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值