最大公约数与最小公倍数

最大公约数:

/*功能:计算两个正整数的最大公约数
 *思路:正向遍历算法:【应该从1开始,到两个数的较小数结束,正向遍历全部数据】
 *@author 何龙
 *@Date:2014-5-3 深夜
 */
public class GreatestCommonDivisor1 {
	private int a;
	private int b;

	public GreatestCommonDivisor1(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public void gcd() {
		if (a == b)
			System.out.println(a + "和" + b + "的最大公约数是" + a);
		else {
			int result = 0;
			int k = a < b ? a : b;// 把a和b中的较小值赋给了变量k,作为遍历结束的标志
			for (int i = 1; i <= k; i++) {
				if (a % i == 0 & b % i == 0) {
					result = i;
				}
			}
			System.out.println(a + "和" + b + "的最大公约数是" + result);
		}
	}

	// for循环可以用while来代替!!!
	// while (i <= k) { if (a % i == 0 && b % i == 0) { result = i; } i++; }

	public static void main(String args[]) {
		GreatestCommonDivisor1 test = new GreatestCommonDivisor1(16, 6);
		test.gcd();
	}
}
小优化一下

/*功能:计算两个正整数的最大公约数
 *思路:逆向遍历算法:【应该从两个数的较小数开始,到1结束,逆向遍历,若存在i可以同时被a和b整除,那么直接break,提高了算法的效率】
 *@author 何龙
 *@Date:2014-5-3 深夜
 */
public class GreatestCommonDivisor2 {
	private int a;
	private int b;

	public GreatestCommonDivisor2(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public void gcd() {
		if (a == b)
			System.out.println(a + "和" + b + "的最大公约数是" + a);
		else {
			int result = 0;
			int k = a < b ? a : b;// 把a和b中的较小值赋给了变量k,作为遍历开始的标志
			for (int i = k; i >= 1; i--) {
				if (a % i == 0 & b % i == 0) {
					result = i;
					break;
				}
			}
			System.out.println(a + "和" + b + "的最大公约数是" + result);
		}
	}

	public static void main(String args[]) {
		GreatestCommonDivisor2 test = new GreatestCommonDivisor2(81, 9);
		test.gcd();
	}
}
欧几里得算法:

/*功能:计算两个正整数的最大公约数
 *思路:欧几里得算法(辗转相除法)这种算法优于前两种的遍历算法
 * @author:何龙
 * @date:2014-5-3深夜
 */
public class GreatestCommonDivisor3 {
	private int a;
	private int b;

	public GreatestCommonDivisor3(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public void gcd() {
		if (a == b)
			System.out.println(a + "和" + b + "最大公约为:" + a);
		else {
			int t = a;
			int t2 = b;// 用t1和t2保存a和b的初始值,便于输出时引用,因为后面更改了a和b的值
			int k = a % b;
			while (k != 0) {
				a = b;
				b = k;
				k = a % b;
			}
			System.out.println(t + "和" + t2 + "最大公约为:" + b);
		}
	}

	public static void main(String args[]) {
		GreatestCommonDivisor3 test = new GreatestCommonDivisor3(24, 10);
		test.gcd();
	}

}

最小公倍数:

/*功能:计算两个正整数的最小公倍数
 *思路:正向遍历i从a和b的较大数开始到a*b结束,如果i可以同时被a和b整除,那么break;(for循环实现)
 * @author:何龙
 * @date:2014-5-3 深夜
 */
public class LeastCommonMultiple1 {
	private int a;
	private int b;

	public LeastCommonMultiple1(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public void lcm() {
		if (a == b)
			System.out.println(a + "和" + b + "的最小公倍数是:" + a);
		else {
			int result = 0;
			int k = a > b ? a : b;
			for (int i = k; i <= a * b; i++) {
				if (i % a == 0 && i % b == 0) {
					result = i;
					break;
				}
			}
			System.out.println(a + "和" + b + "的最小公倍数是:" + result);
		}
	}

	public static void main(String args[]) {
		LeastCommonMultiple1 test = new LeastCommonMultiple1(23, 23);
		test.lcm();

	}
}
while循环:

/*功能:求两个正整数的最小公倍数
 *思路:正向遍历i从a和b的较大数开始到a*b结束,如果i可以同时被a和b整除,那么break;(while循环实现)
 *@author:何龙
 *@date:2014-5-2 
 */
public class LeastCommonMultiple1_1 {
	private int a;
	private int b;

	public LeastCommonMultiple1_1(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public void lcm() {
		if (a == b)
			System.out.println(a + "和" + b + "的最小公倍数是" + a);
		else {
			int k = a > b ? a : b;
			while (k <= a * b) {
				if (k % a == 0 && k % b == 0) {
					break;
				}
				k++;
			}
			System.out.println(a + "和" + b + "的最小公倍数是" + k);

		}
	}

	public static void main(String args[]) {
		LeastCommonMultiple1_1 test = new LeastCommonMultiple1_1(23, 4);
		test.lcm();
	}
}

优化一下:

/*功能:计算两个正整数的最小公倍数
 *思路:让大的那个数*1,*2,*3,*4 一直乘到可以被另一个数整除为止,算法效率明显高于正向遍历算法
 *@author:何龙
 *@date:2014-5-3 深夜
 */
public class LeastCommonMultiple2 {
	private int a;
	private int b;

	public LeastCommonMultiple2(int a, int b) {
		this.a = a;
		this.b = b;

	}

	public void lcm() {
		if (a == b)
			System.out.println(a + "和" + b + "的最小公倍数是:" + a);
		else {
			int max = Math.max(a, b);
			int min = Math.min(a, b);
			for (int i = 1;; i++) {
				max = Math.max(a, b) * i;
				if (max % min == 0) {
					break;
				}
			}
			System.out.println(a + "和" + b + "的最小公倍数是:" + max);
		}
	}

	public static void main(String args[]) {
		LeastCommonMultiple2 test = new LeastCommonMultiple2(18, 12);
		test.lcm();
	}
}

最大公约数与最小公倍数同时求:

/*功能:计算两个正整数的最大公约数和最小公倍数
 *思路:欧几里得算法,两个正整数的乘积=最大公约数*最小公倍数
 *@author:何龙
 *@date:2014-5-3深夜
 */
public class LcmGcdTest {
	private int a;
	private int b;

	public LcmGcdTest(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public int gcd() {
		if (a == b) {
			System.out.println(a + "和" + b + "最大公约为:" + a);
			return a;
		} else {
			int m = a;
			int n = b;// 用t1和t2保存a和b的初始值,便于输出时引用,因为后面更改了a和b的值
			int k = m % n;
			while (k != 0) {
				m = n;
				n = k;
				k = m % n;
			}
			System.out.println(a + "和" + b + "最大公约为:" + n);
			return n;
		}
	}

	public void lcm() {
		int result = (a * b) / this.gcd();
		System.out.println(this.a + "和" + this.b + "最小公倍数:" + result);

	}

	public static void main(String args[]) {
		LcmGcdTest test = new LcmGcdTest(12, 8);
		// test.gcd();在调用lcm()时调用了gcd(),gcd()输出了最大公约数的值,不用再写
		test.lcm();
	}
}

没办法,强迫症啊,就得用GUI!!!

/*功能:计算两个正整数的最大公约数和最小公倍数
 *思路:欧几里得算法,两个正整数的乘积=最大公约数*最小公倍数
 *本程序在JApplet中运行,要熟练掌握GUI编程以及事件监听器的使用
 *@author:何龙
 *@date:2014-5-3深夜
 */
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JTextArea;

public class LcmGcdTestGUI extends JApplet implements ActionListener {
	/**
	 */
	private static final long serialVersionUID = 1L;
	private int a;
	private int b;

	JLabel label1, label2;
	JTextField input1, input2;
	JTextArea outputArea;

	public void init() {
		this.setSize(450, 200);
		label1 = new JLabel("输入正整数a:");
		label2 = new JLabel("   输入正整数b:");
		label1.setFont(new Font("Dialog", 0, 16));// (1代表粗体,0代表平常,15是字号)
		label2.setFont(new Font("Dialog", 0, 16));

		input1 = new JTextField(5);
		input2 = new JTextField(5);
		input1.addActionListener(this);
		input2.addActionListener(this);
		outputArea = new JTextArea(10, 30);
		outputArea.setEditable(false);
		

		Container container = getContentPane();
		container.setLayout(new FlowLayout());
		container.add(label1);
		container.add(input1);
		container.add(label2);
		container.add(input2);
		container.add(outputArea);

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		doCalc();
	}

	// 异常处理
	public void doCalc() {
		try {
			a = Integer.parseInt(input1.getText());
			b = Integer.parseInt(input2.getText());
			lcmgcd(a, b);
		} catch (Exception e) {
			doError();
		}
	}

	public void doError() {
		outputArea.setBackground(Color.red);
		outputArea.setFont(new Font("Kaiti", Font.BOLD, 25));
		outputArea.setText("ERROR!!!\n请输入两个正确的正整数!!!");
		showStatus("ERROR:请检查出入数据,确保为两个正整数!");
	}

	// lcmgcd()用了欧几里得算法求出最大公约数,然后再用a*b/n求出最小公倍数
	public void lcmgcd(int a, int b) {
		outputArea.setFont(new Font("Kaiti", Font.BOLD, 25));
		outputArea.setBackground(Color.green);
		showStatus("PASS:输入正确,谢谢使用!!!【何龙作品】  QQ:471628912");
		if (a == b) {
			outputArea.setText(a + "和" + b + "的最大公约数是:" + a + "\n" + a + "和"
					+ b + "的最小公倍数是:" + a);
		} else {
			int m = a;
			int n = b;
			int k = a % b;
			while (k != 0) {
				m = n;
				n = k;
				k = m % n;
			}
			int lcm = (a * b) / n;
			outputArea.setText(a + "和" + b + "的最大公约数是:" + n + "\n" + a + "和"
					+ b + "的最小公倍数是:" + lcm);
		}
	}
}
结果:

哈哈,完工!!!好几个小时的成果!!!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值