程序设计与方法学作业一之求两个正整数的最大公约数和最小公倍数
第二章
题目:求两个正整数的最大公约数和最小公倍数。
基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
提高要求:
1.三种以上算法解决两个正整数最大公约数问题。
2.求3个正整数的最大公约数和最小公倍数。
1.欧几里德算法
欧几里德算法也叫辗转相除法
原理是两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
用x*y的值除以最大公因数就是最小公倍数
/**
* 欧几里德算法 辗转相除法
* @param x
* @param y
*/
public static void getResult1(int x, int y) {
int temp = 0; //首先定义临时变量temp
int m = x * y; //计算x*y的值,方便之后算最小公倍数
while(y != 0) {
temp = x % y; //将x%y的值赋给y,将y赋给x,直到y为0
x = y;
y = temp;
}
System.out.println("最大公因数1:" + x);
System.out.println("最小公倍数1:" + m/x); //用x*y的值初一最大公因数就是最小公倍数
}
2.辗转相减法
辗转相减法即通过对两数的不断减法运算。
直至 x = y 时,即为最大公因数
最小公倍数求法同上
/**
* 辗转相减法
* @param x
* @param y
*/
public static void getResult2(int x, int y) {
int m = x * y; //同上
while (x!=y)
{
if (x>y)
x = x-y; //当x不等于y的时候,当x>y时,就将x-y赋值给x,否则将y-x赋值给y
else
y = y-x;
}
System.out.println("最大公因数2:" + x);
System.out.println("最小公倍数2:" + m/x); //同上
}
3.穷举法
这个方法就是不断的求两个数的公因数,直到最后,求出最大的公因数
/**
* 穷举法
* @param x
* @param y
*/
public static void getResult3(int x, int y) {
int m = x * y; //同上
int t = 0;
for (int i=1; i <= x; i++) {
if ( x%i == 0 && y%i ==0 ) { //穷举所有的i,到最后符合条件的及就是最大公因数
t=i;
}
}
System.out.println("最大公因数3:" + t);
System.out.println("最小公倍数3:" + m/t); //同上
}
求多个值的最大公因数和最小公倍数
最后的求多个值的最大公因数和最小公倍数:
主要方法还是之前的,只是在之前的两个值的基础上将前两个值的最大公因数和最小公倍数与之后的继续求,以此类推。
以下为全部代码:
package shilaoshi;
import java.util.Map;
import java.util.Scanner;
public class CommonDivisor1 {
/**
* 欧几里德算法 辗转相除法
* @param x
* @param y
* @return
*/
public static int getResult1(int x, int y) {
int temp = 0; //首先定义临时变量temp
int m = x * y; //计算x*y的值,方便之后算最小公倍数
while(y != 0) {
temp = x % y; //将x%y的值赋给y,将y赋给x,直到y为0
x = y;
y = temp;
}
return x;
// System.out.println("最大公因数1:" + x);
// System.out.println("最小公倍数1:" + m/x); //用x*y的值初一最大公因数就是最小公倍数
}
/**
* 辗转相减法
* @param x
* @param y
* @return
*/
public static int getResult2(int x, int y) {
int m = x * y; //同上
while (x!=y)
{
if (x>y)
x = x-y; //当x不等于y的时候,当x>y时,就将x-y赋值给x,否则将y-x赋值给y
else
y = y-x;
}
// System.out.println("最大公因数2:" + x);
// System.out.println("最小公倍数2:" + m/x); //同上
return m/x;
}
/**
* 穷举法
* @param x
* @param y
*/
public static void getResult3(int x, int y) {
int m = x * y; //同上
int t = 0;
for (int i=1; i <= x; i++) {
if ( x%i == 0 && y%i ==0 ) { //穷举所有的i,到最后符合条件的及就是最大公因数
t=i;
}
}
System.out.println("最大公因数3:" + t);
System.out.println("最小公倍数3:" + m/t); //同上
}
/**
* 多个值的最大公因数和最小公倍数的求法
* @param a
*/
public static void getResult4(int[] a){
int commonFactor = a[0];
int commonMultiple = a[0];
for (int i = 1; i < a.length; i++) {
commonFactor = getResult1(commonFactor, a[i]);
commonMultiple = getResult2(commonMultiple, a[i]);
}
System.out.println("最大公因数: "+commonFactor);
System.out.println("最小公倍数: "+commonMultiple);
}
/**
*
* @param args
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int a[] = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = scanner.nextInt();
}
getResult4(a);
scanner.close();
}
}