Chapter02——最大公约数和最小公倍数

题目:求两个正整数的最大公约数和最小公倍数

方法一:欧几里德算法

package zuoye;
import java.util.Scanner;
/**
 * 求两个正整数的最大公约数和最小公倍数
 * @author 
 *
 */
public class Exanple01
{
	
	public static void main(String[] args) 
	{
		System.out.println("输入两个数,求这两个数的最大公约数和最小公倍数");
		Scanner scan = new Scanner(System.in);
		
		System.out.println("请输入第一个数:");   //输入第一个数
		int x =  scan.nextInt();
		
		System.out.println("请输入第二个数:");   //输入第二个数
		int y = scan.nextInt();
		
		int yin = maxCommonFactor( x, y);
		int bei = maxCommonMultiple(x,y);
		System.out.println("最大公因数为:"+yin);
		System.out.println("最小公倍数为:"+bei);
	}
	
	/**
	 * 求最大公因数:
	 *   采用欧几里德算法:
	 *   用两者之间最大的那个数整除另外一个数,获取余数
	 *     (1)若两个数相等,则最大公约数为两者中的一个;
	 *     (2)若两个数不相等,则用大的那个数对小的那个数取余,然后把小的那个数
	 *        作为被除数,把余数作为除数,如此循环,直到除数为0停止。
	 * @param m
	 * @param n
	 * @return
	 */
	public static int maxCommonFactor(int m,int n) {//求最大公约数
		
		int t = 0;
		if(m<n)        //无论何时,都让m为最大的那个数n为较小的那个数
		{
			t = n;
			n = m;
			m = t;
		}
		
		while(n != 0)      
		{
			if(m == n)     //若两个数相等,最大公因数为其中之一
			{
				return m;
			}
			else{
			int k = m%n;   //若两个数不相等,用最大数对小的那个数取余,直至除数为0
			m = n;
			n = k;
			}
		}
		return m;        
	}
	
	/**
	 * 采用公式法求最小公倍数:
	 *    由于两个数的乘积=这两个数的最大公约数X最小公倍数
	 *    所以求出最大公约数后,最小公倍数=两数之积/最小公约数
	 * @param m
	 * @param n
	 * @return
	 */
	public static  int maxCommonMultiple(int m,int n) { //求最小公倍数
		int z = m*n;         //两数之积
		int temp = maxCommonFactor(m,n);  //调用求最大公约数的方法,得到最大公约数    
		return (z/temp);     //用两数之积/最大公约数,返回最小公倍数
	}
}

方法二:更相减损法

package zuoye;
import java.util.Scanner;
public class Example02 {
	public static void main(String[] args) {
		System.out.println("输入两个数,求这两个数的最大公约数和最小公倍数");
		Scanner scan = new Scanner(System.in);
		
		System.out.println("请输入第一个数:");   //输入第一个数
		int x =  scan.nextInt();
		
		System.out.println("请输入第二个数:");   //输入第二个数
		int y = scan.nextInt();
		
		 maxCommonFactor(x,y);
		int bei = maxCommonMultiple(x,y);
		
	}
	
	
	/**
	 * 采用更相减损法求最大公约数:
	 *   (1)任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
	 *   (2)以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。
	 *       继续这个操作,直到所得的减数和差相等为止。
	 *   (3)则第(1)步中约掉的若干个2与第(2)步中等数的乘积就是所求的最大公约数。。
	 */
	public static int maxCommonFactor(int m,int n) //求最大公约数
	{
		int t = 0;    //记录两个数整除2的次数  
		while((m %2 == 0) && (m % 2 == 0)) //判断两个数是否能整除2
		{
			m = m/2;
			n= n/2;
			t++;
		}
		while(m != n) {   //用较大的数减去较小的数,直到减数和差相等   
			if(m>n)
			{
				m = m-n;
			}else {
				n = n-m;
			}
		}
		if(t == 0) //能整除2的次数为0
		{    
			System.out.println("最大公约数为:"+m);
		}else      //能被2整除的次数不为0
		{        
			System.out.println("最大公约数为:"+2*t*m);
		}
		return m;
	}
	
	
	/**
	 * 求最小公倍数:
	 *   (1)先找到两者之中,较大的那个数
	 *   (2)如果较大的数对较小的数取余:
	 *      余数为0,则最大公倍数为两数之积除以较小的那个数
	 *      余数不为0,则把余数作为除数,较小的那个数作为被除数,循环取余,
	 *      直到余数为0,则最大公倍数就是原来两数之积除以那个最小的余数
	 *      
	 * @param m
	 * @param n
	 * @return
	 */
	public static int maxCommonMultiple(int m,int n)//求最大公倍数
	{
		int t = 0;
		int z = m*n;            //两数之积
		if(m<n)                 //总是让m为最大的那个数,n为较小的那个数
		{
			t = n;
			n = m;
			m = t;
		}
		while(true)    
		{
			int k = m%n;      //两数取余
			if(k==0)          //判断余数是否为0
			{
				System.out.println("最小公倍数为:"+z/n);  
				break; 
			}else {           //余数不为0,把余数作为除数,	              
				m = n;        // 较小的那个数作为被除数,循环取余,直到余数为0
				n = k;
			}
		}
		return m;
	}
}

方法三:定义一个数,这个数从输入的两个数中最小的那个数开始递减。并让输入的两个数对这个数分别取余,若两个数对这个数余数第一次同时为0时,这个数则为最大公约数。

package zuoye;
import java.util.Scanner;
public class Example03 
{
	public static void main(String[] args) {
		System.out.println("输入两个数,求这两个数的最大公约数和最小公倍数");
		Scanner scan = new Scanner(System.in);
		
		System.out.println("请输入第一个数:");   //输入第一个数
		int x =  scan.nextInt();
		
		System.out.println("请输入第二个数:");   //输入第二个数
		int y = scan.nextInt();
		
		maxCommonFactor(x,y);
		maxCommonMultiple(x,y);
	}
	
	/**
	 * 求最大公约数:
	 *   定义一个数,这个数从输入的两个数中最小的那个数开始递减。并让输入的两个数
	 *   对这个数分别取余,若两个数对这个数余数第一次同时为0时,这个数则为最大公约数
	 * @param m
	 * @param n
	 * @return
	 */
	 public static int maxCommonFactor(int m,int n) //求最大公约数
	 {
		 if (m < n)                   //让m永远是最大的那个数
		 {		 
		     m = m +n;
		     n = m -n;
		     m = m -n;
		 }
		 for(int t =n;t>0;t--)        //t为定义的递减的那个数
		 {
			 if((m % t==0)&&(n%t==0))
			 {
				 System.out.println("最大公约数为:"+t);
				 break;
			 }
		 }
		 return m;
	 }
	
	
	 /**
		 * 求最小公倍数:
		 *   (1)先找到两者之中,较大的那个数
		 *   (2)如果较大的数对较小的数取余:
		 *      余数为0,则最大公倍数为两数之积除以较小的那个数
		 *      余数不为0,则把余数作为除数,较小的那个数作为被除数,循环取余,
		 *      直到余数为0,则最大公倍数就是原来两数之积除以那个最小的余数
		 *      
		 * @param m
		 * @param n
		 * @return
		 */
		public static int maxCommonMultiple(int m,int n)//求最大公倍数
		{
			int t = 0;
			int z = m*n;            //两数之积
			if(m<n)                 //总是让m为最大的那个数,n为较小的那个数
			{
				t = n;
				n = m;
				m = t;
			}
			while(true)    
			{
				int k = m%n;      //两数取余
				if(k==0)          //判断余数是否为0
				{
					System.out.println("最小公倍数为:"+z/n);  
					break; 
				}else {           //余数不为0,把余数作为除数,	              
					m = n;        // 较小的那个数作为被除数,循环取余,直到余数为0
					n = k;
				}
			}
			return m;
		}
}

求三个数的最大公约数和最小公倍数

package zuoye;
import java.util.Scanner;
public class Example04 
{
	public static void main(String[] args) 	
	{
		System.out.println("输入三个数,求这三个数的最大公约数和最小公倍数");
		Scanner scan = new Scanner(System.in);
		
		System.out.println("请输入第一个数:");   //输入第一个数
		int x =  scan.nextInt();
		
		System.out.println("请输入第二个数:");   //输入第二个数
		int y = scan.nextInt();
		
		System.out.println("请输入第三个书:");
		int z = scan.nextInt();
		maxCommonFactor(x,y,z);
		int bei = maxCommonMultiple(x,y,z);
		System.out.println("最小公倍数为"+bei);
	}
	
	
	/**
	 * 
	 * 求最大公约数:
	 *   定义一个数,这个数从输入的三个数中最小的那个数开始递减。并让输入的三个数
	 *   对这个数分别取余,若三个数对这个数余数第一次同时为0时,这个数则为最大公约数
	 * @param a
	 * @param b
	 * @param c
	 * @return
	 */
	public static int maxCommonFactor(int a,int b,int c)//求最大公约数
	{
		//对a、b、c排序,永远让a>b>c
		 if(a < b) {
		     int t = a;
		     a = b;
		     b = t;
		    }
		      if(a < c) {
		     int t = a;
		     a = c;
		     c = t;
		    }
		     if(b < c) {
		     int t = b;
		     b = c;
		     c = t;
		    }
		     //System.out.println(a+" "+b+" " +c);//对结果进行检验
		     
		     for(int t = c;t>=0;t--)        //t为定义的递减的那个数
		     {
		    	//若三个数同时除以从最小数开始递减的数为0时,则这个数为最大公约数
		    	 if((a % t==0)&&(b%t==0)&&(c %t ==0))   
				 {
					 System.out.println("最大公约数为:"+t);
					 break;
				 }
		     }
		     return a;
	}
	
	/**
	 * 求最小公倍数
	 * (1)先求出三者之中,最大的那个数
	 * (2)定义一个数,令此数为最大的那个数,可以无限大;
	 *    这个数从初值(最大的数)开始每次递增1,并且用这个数对输入的三个数分别取余,
	 *    若余数同时为0时,此时这个数为最小公倍数
	 * @param a
	 * @param b
	 * @param c
	 * @return
	 */
	public static int maxCommonMultiple(int a, int b, int c){		//求最小公倍数
		int max = getMax(a,b,c);
		for(int i=max ; ;i++){          //定义这个数为i,从最大数开始递增
			if(i%a==0&i%b==0&&i%c==0){
				return i;
			}
		}
	}
	 
	public static int getMax(int a, int b, int c){		//求三个数中的最大数
		 if(a < b) 
		 {
		     int t = a;
		     a = b;
		     b = t;
		 }
		 if(a < c) 
		 {
		     int t = a;
		     a = c;
		     c = t;
		  }
		  if(b < c)
		  {
		     int t = b;
		     b = c;
		     c = t;
		  }
		  return a;    
	}
}

总结:最大公约数的算法主要是欧几里德算法和更相减损法,主要思路清楚,算法并不难。三个数的求法思路和两个数的相同,主要还是要细心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值