Java Home

Java技术修炼中...
posts - 20, comments - 22, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

求最大公约数的算法

Posted on 2006-12-07 01:02 Yemoo'S Java Blog 阅读(7751) 评论(4)  编辑  收藏 所属分类: 算法与数据结构
/**
 *Description:greatest common divisor
 *Author:yemoo 2006.12.06
 
*/

 
public   class  Pt32{
    
// 思路:辗转相除法
      int  divisor1( int  m, int  n){     // 方法一:循环法
          int  temp;
         
if (m < n){     // if m<n,swap m,n
             temp = m;
             m
= n;
             n
= temp;
         }
         
while (m % n != 0 ){
             temp
= n;
             n
= m % n;
             m
= temp;
         }
         
return  n;
     }

     
int  divisor2( int  m, int  n){     // 方法二:递归法
          int  temp;
         
if (m < n){
             temp
= m;
             m
= n;
             n
= temp;
         }
         
return  divisor22(m,n);
     }

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

     
public   static   void  main(String args[]){
         KeyboardInput in
= new  KeyboardInput();
         Pt32 obj
= new  Pt32();
         System.out.println(
" input two integer: " );
         
int  a = in.readInt();
         
int  b = in.readInt();
         System.out.println(a
+ " , " + b + " 's greatest common divisor is  " + obj.divisor2(a,b));
     }

 }

使用了辗转相除法,分别使用循环和递归方法实现。

吸取dreamstone大哥的程序写法,发现判断m、n大小的部分可以删除,因为如果m<n求余部分会自动交换两个变量。

改进后程序代码(精简了好多哦):
/**
 *Description:greatest common divisor
 *Author:yemoo 2006.12.07 
*/

 
public class Pt32{
    
//思路:辗转相除法
     int divisor1(int m,int n){    //方法一:循环法
         int temp;
         
while(m%n!=0){
             temp
=n;
             n
=m%n;
             m
=temp;
         }
         
return n;
     }

     
int divisor2(int m,int n){    //方法二:递归法
         if(m%n==0){
            
return n;
        }
else{
            
return divisor2(n,m%n);
        }
     }

     
public static void main(String args[]){
         KeyboardInput in
=new KeyboardInput();
         Pt32 obj
=new Pt32();
         System.out.println(
"input two integer:");
         
int a=in.readInt();
         
int b=in.readInt();
         System.out.println(a
+","+b+"'s greatest common divisor is "+obj.divisor2(a,b));
     }

 }

评论

# re: 求最大公约数的算法  回复  更多评论   

2006-12-07 23:19 by dreamstone
其实象求最大公约数等数学相关的需求,首先要考虑的是数学上有没有算法,而不应该是直接便利或者递归。比如公约数可以利用欧几里得定理,见这里:
http://www.blogjava.net/dreamstone/archive/2006/09/22/71221.html
性能会有很大的提升

# re: 求最大公约数的算法  回复  更多评论   

2006-12-08 00:22 by Yemoo'S Java Blog
hoho!大哥应该没有详细看偶的算法吧?

偶的这两个算法不就等同于你的第三个写法中的算法吗?只是用两种程序结构体现出来了。还是同一个算法(相除求余)。

欧几里得是否就是那个递归求差的算法(您写的第二个)?

不过要感谢大哥你的程序启发.
偶发现如下判断大小部分可以去掉:
if (m < n){
temp = m;
m = n;
n = temp;
}
因为如果m<n则第一次求余过程中也会交换两个变量,这点偶向复杂了,偶的算法改进下。

# re: 求最大公约数的算法[未登录]  回复  更多评论   

2009-11-25 12:28 by free
你如果一个数是9,一个是17,两个没公约数的数呢?怎么判断?

# re: 求最大公约数的算法  回复  更多评论   

2010-04-17 19:04 by scsdfy
丫的,上面的都运行不了。我才是最强滴男人,我来写个最简单的:
import java.util.Scanner;
public class UseRecursion
{
public static void main(String[] args)
{ Scanner scanner =new Scanner(System.in);
System.out.println("shu ru:");
System.out.print("m= ");
int m=scanner.nextInt();
System.out.print("n= ");
int n=scanner.nextInt();
System.out.println("GCD: "+gcd(m,n));
}
private static int gcd(int m,int n)
{
if (n==0) return m;
else return gcd(n,m%n);}
}

只有注册用户登录后才能发表评论。


网站导航: