求最大公约数的快速算法

原创 2007年10月08日 21:21:00
 
/*
 stein 算法求最大公约数,和欧基里德算法相比,效果更好:
 主要思想如下: 化归思想
 
  
 1.m为奇数时:
    (1)n也为奇数:gcd(m,n) = gcd((m+n)/2,(m-n)/2) ;
    (2)n为偶数:  gcd(m,n) = gcd(m,n/2) ;
  
 2.m为偶数时:
   (1) n也为偶数:gcd(m,n) = gcd(m/2,n/2);
   (2) n为奇数:  gcd(m,n) = gcd(m/2,n);

 3.m == n 时,gcd(m,n) = m 退出
  
*/

 
#include 
<stdio.h>

int stein_gcd ( int m , int n )
{
    
int temp,total=0 ;
    
if ( m < n )
    
{
         temp 
= m ;
         m 
= n ;
         n 
= temp ;
    }

    
    
if ( n == 0 )
    
return 0 ;
    
    
while ( m != n )
    
{
          
if ( m & 1/* 如果m 为奇数, 因为奇数的后面总有一个1,所以可以通过与1且一下来判断是否是偶数*/
          
{
               
if ( n & 1/* m,n都为奇数*/
               
{
                    temp 
= m ;
                    m 
= (m+n)>>1 ;
                    n 
= (temp-n)>>1;
               }

               
else
               
{
                    n  
>>= 1 ;
               }

          }

          
else /* m为偶数 */
          
{
               
if ( n & 1/*n 为奇数*/
               
{
                    m 
>>= 1 ; /*由于在这个过程中,m可能小于n ,所以要判断一下*/
                    
if ( m < n )
                    
{
                         temp 
= m ;
                         m 
= n ;
                         n 
= temp ;
                    }

               }

               
else
               
{
                    m 
>>= 1 ;
                    n 
>>= 1 ;
                    total 
++ ; /*记录缩小的倍数*/
               }

          }

    }

    
    m 
<<= total ; /*还原大小*/
    
    
return m ;
}


               
               
               
    
    
int main(void)
{
    
int m,n,max=0;
    
    scanf(
"%d %d",&m,&n);
    
    max 
= stein_gcd(m,n);
    
    printf(
"max= %d ",max);
    
    
    
/*
    test
    
    while( (scanf("%d",&m)) && m != 0 )
    {
           if ( m & 1)
           printf("%d是奇数 ",m);
           else
           printf("%d是偶数 ",m);
    }
    
*/
       
    system(
"pause");
    
return 0 ;
}

 

求最大公约数的高效率算法

声明:下文中的算法与数学原理,都是从《编程之美》的2.7节中的解法三看到后,摘抄和修改而来的。 数学原理公式: 若x,y均为偶数,f(x,y) = 2 * f(x/2,y/2); 若...
  • u014653197
  • u014653197
  • 2016年09月19日 21:03
  • 1754

求最大公约数的高效率算法

声明:下文中的算法与数学原理,都是从《编程之美》的2.7节中的解法三看到后,摘抄和修改而来的。 数学原理公式: 若x,y均为偶数,f(x,y) = 2 * f(x/2,y/2); 若...
  • u014653197
  • u014653197
  • 2016年09月19日 21:03
  • 1754

求两个数的最大公约数的三种算法

从键盘输入两个整数,求着两个整数的最大公约数。 解题思路: 从键盘输入两个数,通过以下的三个方法实现求两个数的最大公约数:     辗转相除法:取两个数中最大的数做除数,较小的数做被除...
  • only_invarably
  • only_invarably
  • 2017年03月22日 22:01
  • 14762

最大公约数GCD的三种算法程序

这里给出使用欧几里得算法求最大公约数的递归和非递归的程序,同时给出穷举法求最大公约数的程序。 从计算时间上看,递推法计算速度最快。 程序中包含条件编译语句用于统计分析计算复杂度。 /* * 计算两个...
  • tigerisland45
  • tigerisland45
  • 2016年04月14日 14:57
  • 7327

【递归】求最大公约数(函数)

上机内容:C++程序的编写和运行 上机目的:掌握简单C++程序的编辑、编译、连接和运行的一般过程 我的程序:/* Copyright (c) 2013, 烟台大学计算机学院 * All righ...
  • u012370487
  • u012370487
  • 2013年11月25日 08:44
  • 1891

三种方法求解最大公约数

%greatest common divisor 最大公约数 clc; clear; %1.辗转相除法(欧几里得算法):两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公...
  • sinat_25357975
  • sinat_25357975
  • 2016年10月16日 22:11
  • 742

欧几里得法求最大公约数

欧几里得法求最大公约数: 求a和b的最大公约数 记 a mod b=c ,即a=kb+c  设a b的最大公约数为d,则a=m*d b=n*d,m和n互质。 c=a-kb=md-knd=(m-...
  • shaolianbo
  • shaolianbo
  • 2013年02月02日 15:58
  • 4639

【C/C++】求最大公约数的三种方法

一、最大公约数与最小公倍数 最大公约数,属于数论所探究的内容。 最大公约数可以通过下面的三种方法求出来。 最小公倍数呢,它与最大公约数的乘机为所求数之积。   比如求  x,y的最大公约数和最小公倍数...
  • qq_31828515
  • qq_31828515
  • 2016年07月02日 20:48
  • 27542

求最大公约数和最小公倍数(递归算法及非递归算法)

最近做题目发现一些题目需要求数的最大公约数和最小公倍数,想想最大公约数和最小公倍数平时做数学的时候感觉不是很难,但是突然要编程来实现,却一下子不知所措了,后来看了下别人写的,发现其实也不算特别难。最小...
  • hduzhouli
  • hduzhouli
  • 2014年11月25日 19:59
  • 2038

辗转相除法,相减法,穷举法求最大公约数

题目:从键盘输入两个整数,输出两个整数的最大公约数。用C或C++语言实现程序解决问题。 编辑人员:李林轩 时间:2017.3.20 程序算法 辗转相除法 有两整数a和b: 1.a%b得余数c 2.若...
  • li1198874812
  • li1198874812
  • 2017年03月21日 23:33
  • 857
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求最大公约数的快速算法
举报原因:
原因补充:

(最多只允许输入30个字)