最大公约数:
/*功能:计算两个正整数的最大公约数
*思路:正向遍历算法:【应该从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);
}
}
}
结果:
哈哈,完工!!!好几个小时的成果!!!