问题
编写两个方法,分别求两个数的最大公约数和最小公倍数
代码
package gongyveshu;
import java.util.Scanner;
public class gongyveshu {
static void gys(int a,int b) {//公约数计算
int term1=0,term2=0,flag=0,i=2,m=2;//term1存储a的约数,term2存储b的约数,flag存储a,b共同的约数
if(a%b==0) System.out.println(a+"和"+b+"的最大公约数是"+b);
else if(b%a==0) System.out.println(a+"和"+b+"的最大公约数是"+a);
else {
while((i<=a/2)&&(m<=b/2)) {//采用循环,循环条件只需要到达a/2&&b/2,因为大于a/2后会出现重复
for(;term1<=term2&&i<=a/2;i++) {//先求出a的一个约数,之后break,在求b的一个约数
if(a%i==0) {
term1=i;
i++;
break;
}
}
for(;term2<term1&&m<=b/2;m++) {//当b的约数小于a的约数时,继续求b的约数,但是当b的约数和a的约数相同时不会执行
if(b%m==0) {
term2=m;
m++;
break;
}
}
if(term1==term2) flag=term1;
}
if(flag!=0) System.out.println(a+"和"+b+"的最大公约数:"+flag);
else System.out.println(a+"和"+b+"没有最大公约数。");
}
}
static void gbs(int a,int b) {
int term1=a,term2=b,flag=0;//term1存储a的倍数,term2存储b的倍数,flag存储a,b的公倍数
if(a%b==0) System.out.println(a+"和"+b+"的最小公倍数是"+a);
else if(b%a==0) System.out.println(a+"和"+b+"的最小公倍数是"+b);
else {
while(flag<=a*b) {//最小公倍数最大是a*b
for(int i=2;term1<term2&&i<=b;i++) {//求出a的一个倍数
term1=a*i;
}
for(int m=2;term2<term1&&m<=a;m++) {//求b的一个倍数,但有需要在b的前一个倍数小于a的倍数的前提下
term2=b*m;
}
if(term1==term2) {
flag=term1;
System.out.println(a+"和"+b+"的最小公倍数是"+flag);
break;
}
}
}
}
public static void main(String args[]) {
System.out.println("这个程序是计算两个数的最大公约数和最小公倍数:");
System.out.println("输入两个大于2的数:");
Scanner sc=new Scanner(System.in);
int a=sc.nextInt(),b=sc.nextInt();
gys(a,b);
gbs(a,b);
sc.close();
}
}