求两个正整数的最大公约数和最小公倍数
基本要求:
1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
提高要求:
1.三种以上算法解决两个正整数最大公约数问题。
2.求3个正整数的最大公约数和最小公倍数。
设计思路:
基本要求部分:
两个正整数的最大公约数:
1.辗转相除法:
若有两整数m和n:
(1)比较两数大小,若m小于n,交换
(2) m%n得到余数r
(3)若r为0时,则n是两个数的最大公约数
(4)若r不为0时,则m=n,n=r,再执行(1),继续循环
算法流程图:
2.穷举法
(1)先判断m,n两数的大小,得出最小数min
(2)将min赋给i
(3)用两个数分别对这个数i取余,若有余数,则i-1,再取余,若仍有余数再i-1,继续循环,直到当余数都为零时,则最大公约数为i
算法流程图:
3.相减法
(1)比较m和n的大小,若m>n,m=m-n,若n>m,n=n-m
(2)继续循环(1),直到m=n,退出循环
(3)最大公约数为m
算法流程图:
两个正整数的最小公倍数:最小公倍数=两个数的乘积/最大公约数
提高要求部分:
三个正整数的最大公约数:
(1)先判断m,n,k三数的大小,得出最小数min
(2)将min赋给i
(3)用三个数分别对这个数i取余,若有余数,则i-1,再取余,若仍有余数再i-1,继续循环,直到当三个数除以i余数都为零时,则最大公约数为i
算法思路基本与两个数的穷举法相似,所以没有画算法流程图。
三个整数的最小公倍数:
(1)先判断m,n,k三数的大小,得出最大数max
(2)定义s=1,l,
(3)将s*max赋给l
(4)先用max对三个数分别取余,若有余数,执行s++,再执行(3),则max*2,再取余,若仍有余数,则继续s++,执行(3),此时max*3继续循环,依次递增,直到余数都为零,最大公约数为l。
算法流程图:
源代码:
package Work;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("请问你想计算几个正整数的最大公约数和最小公倍数呢?");
System.out.println(" ");
System.out.println("1.两个正整数 2.三个正整数 ");
System.out.println(" ");
int item1;
Scanner in=new Scanner(System.in);
item1=in.nextInt();//输入选择菜单项
switch(item1){
//选择菜单1,进行计算两个正整数的最大公约数和最小公倍数
case 1:
System.out.println("请输入需要计算的两个数:");
Scanner input=new Scanner(System.in);
int a=input.nextInt();
int b=input.nextInt();
System.out.println("你想通过什么方法进行计算呢?请选择计算的方法...");
System.out.println("1.辗转相除法");
System.out.println("2.循环法");
System.out.println("3.相减法");
int item2;
Scanner wr=new Scanner(System.in);
item2=wr.nextInt();//输入选择菜单项
switch(item2){
case 1:
int c1=divide(a,b); //通过调用函数divide得出最大公约数c1
System.out.println(a+"和"+b+"的最大公约数是:"+c1);
System.out.println("最小公倍数是:"+a*b/c1);
break;
case 2:
int c2=exhaustion(a,b);//通过调用函数exhaustion得出最大公约数c2
System.out.println(a+"和"+b+"的最大公约数是:"+c2);
System.out.println("最小公倍数是:"+a*b/c2);
break;
case 3:
int c3=subtraction(a,b);//通过调用函数subtraction得出最大公约数c3
System.out.println(a+"和"+b+"的最大公约数是:"+c3);
System.out.println("最小公倍数是:"+a*b/c3);
break;
default:
System.out.println("输入的选项不合适...");//若输入的菜单项不是上述数字,则返回提示信息
break;
}
break;
//选择菜单2,进行计算三个正整数的最大公约数和最小公倍数
case 2:
System.out.println("请输入需要计算的三个数:");
Scanner w=new Scanner(System.in);
int i=w.nextInt();
int j=w.nextInt();
int k=w.nextInt();
int c4=threeNumGCD(i,j,k);//调用函数threeNumGCD得出最大公约数c4
int c5=threeNumLCM(i,j,k);//调用函数threeNumLCM得出最小公倍数c5
System.out.println(i+","+j+","+k+"的最大公约数是:"+c4);
System.out.println("最小公倍数是:"+c5);
break;
default:
System.out.println("输入的选项不合适...");//若输入的菜单项不是上述数字,则返回提示信息
break;
}
}
//定义辗转相除法divide函数
public static int divide(int m,int n){
if(m<n){
int temp=m;
m=n;
n=temp;
}
if(m%n==0){
return n;
}
int r=m%n;//定义r为m除以n的余数
while(r!=0){//当m和n余数不为零时将n赋给m,将r赋给n,继续取余,直到余数为零时最大公约数为n
m=n;
n=r;
r=m%n;
}
return n;
}
//定义穷举法exhaustion函数
public static int exhaustion(int m,int n){
int min=m<n?m:n;//判断m,n 的大小,取小数赋值给min
int i;
for(i=min;;i--){//从两个数中最小的数min开始循环,用两个数分别对这个小数min取余,若有余数,则i-1,直到当余数都为零时,则最大公约数为i
if(m%i==0&&n%i==0)
break;
}
return i;
}
//定义相减法subtraction函数
public static int subtraction(int m,int n){
while(m!=n){//比较m和n的大小,若不等,则用大的数去减小的数,得到差,比较差与较小数的大小,若不等则继续循环,直到相减的两数相等
if(m>n){
m=m-n;
}else{
n=n-m;
}
}
return m;
}
//定义计算三个数最大公约数的threeNumGCD函数
public static int threeNumGCD(int m,int n,int k){
int min,i;
min=m<n?m:n;
min=min<k?min:k;//算出三个数中的最小数
for(i=min;;i--){//将最小数赋给i,用三个数分别对i取余,若有余数则i-1,再取余,若再有余数,再i-1,继续循环,直到三个数运算的余数都为零
if(m%i==0&&n%i==0&&k%i==0){
break;
}
}
return i;
}
//定义计算三个数最小公倍数的threeNumLCM函数
public static int threeNumLCM(int d,int e,int f){
int max=d>e?d:e;
max=max>f?max:f;//算出三个数中的最大数
int s=1,l;
while(true){//先用最大数max对三个数分别取余,若有余数,则max*2,再取余,若再都有余数,则max*3,继续循环,依次递增,直到余数都为零
l=max*s;
if(l%d==0&&l%e==0&&l%f==0){
break;
}
s++;
}
return l;
}
}
测试及调试截图:
在算法设计思路中,我写出了每个算法的计算方法,以及它们各自的算法流程图,在主main函数中 ,程序是用switch-case选择结构来选择想要进行的方式,再调用每种算法的函数来实现的。