基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大
公约数问题,提供友好的输入输出。
提高要求:1.三种以上算法解决两个正整数最大公约数问题。
2.求3个正整数的最大公约数和最小公倍数。*
设计思路:
最小公倍数,指两个或多个整数的公倍数里最小的那一个叫做它们的最小公倍数。
最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。求最大公约数有多种方法。
方法一:辗转相除法
也叫欧几里德算法,其方法是用较大的数除以较小数,上面较小除
数和得出的余数构成新的一对数,继续做上面的除法,直到出现能
够整除的两个数,其中较小的数(即除数)就是最大公约数。
public static void Max1(int a,int b){
int i = a;
int j = b;
int x =0,y =0;
//比较输入两个数的大小,a与b若大小顺序不对,就交换位置
if(a>b)
{
x=a;
a=b;
b=x;
}
//最大公约数
while(b != 0){
y = a % b;
a = b;
b = y;
}
//最小公倍数
int t = i * j/ a;
System.out.println(i+"和"+j+"的最大公约数为:"+ a);
System.out.println(i+"和"+j+"的最小公倍数为:"+ t);
}
方法二:定义法
输入的两个整数为,首先求其最小值,然后依次检验最小值,….,1
是否是两个整数的公约数,这样找到的第一个公约数就是最大公约 数。
public static void Max2(int a,int b){
int min;
//求得两个数的最小值
if (a < b)
{
min = a;
}
else{
min=b;
}
//最大公约数
int j = 1;
for (int i=min; i >= 1; i--) {
if (a % i == 0 && b % i == 0 ) {
j = i;
break;
}
}
System.out.println("最大公约数是:" + j);
}
方法三:循环法
输入的两个整数为,检查2,3,4…是否为两个整数的最大公约数,直到所选值大于两个数中较小的一个。
public static void Max3(int a, int b) {
int gcd=1,k=1;
while(k<=a && k<=b)
{
if(a%k==0 && b%k==0)
gcd=k;
k++;
}
System.out.println("最大公约数的结果是:" + gcd);
}
最小公倍数= (a * b * c)/最大公约数
//最小公倍数
int t = i * j/ a;
System.out.println(i+"和"+j+"的最小公倍数为:"+ t);
拓展部分(求三个整数的最大公约数和最小公倍数)
/*
* 求三个数的最大公约数和最小公倍数
*/
public static void Max4(int a,int b,int c){
//求得三个数的最小值
int min;
if (a < b && a < c)
{
min = a;
}
else if (c min = c;
}
else
min = b;
//最大公约数
int j = 1;
for (int i=min; i >= 1; i--) {
if (a % i == 0 && b % i == 0 && b % i == 0 ) {
j = i;
break;
}
}
System.out.println(a+","+b+"和"+c+"的最大公约数是:" + j);
//求三个数的最大值
int max;
if (a > b)
{
max = a;
} else {
max = b;
}
if (max < c)
{
max = c;
}
//最小公倍数
int k=1;
for(int i=max;;i++){
if(i%a==0&i%b==0&&i%c==0){
j=i;
break;
}
}
System.out.println(a+","+b+"和"+c+"的最小公倍数为:"+ j);
}
源代码:
import java.util.Scanner;
public class example {
public static void main(String[]args){
@SuppressWarnings("resource")
Scanner scan = new Scanner(System.in); //键盘输入数字
System.out.print("请输入第一个整数:\n");
int a = scan.nextInt(); //将第一个数赋给a
System.out.print("请输入第二个整数:\n");
int b = scan.nextInt(); //将第二个数赋给b
System.out.print("请输入第三个整数:\n");
int c = scan.nextInt(); //将第二个数赋给c
Max1(a, b); //方法一
Max2(a, b); //方法二
Max3(a, b); //方法三
Max4(a, b,c); //求三个数的最大公约数和最小公倍数
}
/*
* 方法一:辗转相除法(欧几里得算法):在循环中,只要除数不等于0,用较大的数除以较小的数,将小的一个数作为下一轮循环的大数,
* 取得的余数作为下一轮循环较小的数,如此循环直到较小的数值为0,返回较大的数。即为最大公约数。
*最小公倍数= (a * b * c)/最大公约数
*/
public static void Max1(int a,int b){
int i = a;
int j = b;
int x =0,y =0;
//比较输入两个数的大小,a与b若大小顺序不对,就交换位置
if(a>b)
{
x=a;
a=b;
b=x;
}
//最大公约数
while(b != 0){
y = a % b;
a = b;
b = y;
}
//最小公倍数
int t = i * j/ a;
System.out.println(i+"和"+j+"的最大公约数为:"+ a);
System.out.println(i+"和"+j+"的最小公倍数为:"+ t);
}
/*
* 方法二:定义法:输入的两个整数为a和b,首先求a和b的最小值min,赋给i,然后依次检验i,i-1,i-2,....,1是否是a和b的公约数,
* 这样找到的第一个公约数就是最大公约数。
*/
public static void Max2(int a,int b){
int min;
//求得两个数的最小值
if (a < b)
{
min = a;
}
else{
min=b;
}
//最大公约数
int j = 1;
for (int i=min; i >= 1; i--) {
if (a % i == 0 && b % i == 0 ) {
j = i;
break;
}
}
System.out.println("最大公约数是:" + j);
}
/*
* 方法三:循环法:输入的两个整数为a和b,检查k(k=2,3,4…)是否为a和b的最大公约数,直到k大于两个数中较小的一个。
*/
public static void Max3(int a, int b) {
int gcd=1,k=1;
while(k<=a && k<=b)
{
if(a%k==0 && b%k==0)
gcd=k;
k++;
}
System.out.println("最大公约数的结果是:" + gcd);
}
/*
* 求三个数的最大公约数和最小公倍数
*/
public static void Max4(int a,int b,int c){
//求得三个数的最小值
int min;
if (a < b && a < c)
{
min = a;
}
else if (c else
min = b;
//最大公约数
int j = 1;
for (int i=min; i >= 1; i--) {
if (a % i == 0 && b % i == 0 && b % i == 0 ) {
j = i;
break;
}
}
System.out.println(a+","+b+"和"+c+"的最大公约数是:" + j);
//求三个数的最大值
int max;
if (a > b)
{
max = a;
} else {
max = b;
}
if (max < c)
{
max = c;
}
//最小公倍数
int k=1;
for(int i=max;;i++){
if(i%a==0&i%b==0&&i%c==0){
j=i;
break;
}
}
System.out.println(a+","+b+"和"+c+"的最小公倍数为:"+ j);
}
}