今天上软件工程课时老师让用PAD图画出求两个整数的最小公倍数和最小公约数的算法。
果断想到了辗转相除法,然后就继续了。。。。。。。。
碰到的第一个问题是:
一下子转不过来x ,y;这两个值该怎么赋值。
一开始想的是:int r=x%y;用r来作为判断标准:
当r等于零时就不用while循环。除数就为最大公约数,最小公倍数则为:x*y/最大公约数
当r不等于零时,则用while(r!=0){
int temp=x/y;
x=y;
y=temp;
}
来求得最大公约数。再求得最小公倍数:x*y/最大公约数
显然:这是不能完成的,因为此时x与y的值是辗转相除后的值,不是一开始输入的x,y值。而求最小公倍数是要求x,y是开始输入的两个整数值的乘积再除于最大公约数
碰到的第二个问题是:
这里使用的是publicstatic void qiu(int x,int y)来求解最大公约数和最小公倍数。不解的是这里为什么要定义成静态的?
原来是因为:如果不设置为静态的话,就要用对象来调用该方法。如果一个方法不是静态的,则要先实例化该类,比如要这样 qiu t=new qiu();
然后才能调用
下面则为解决这两个困惑后的代码:
import java.util.Scanner;
public class GBS {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
int t=0;
int x=s.nextInt();
int y=s.nextInt();
if(x<y){
int temp=x;
x=y;
y=temp;
qiu(x, y);
}
else{
qiu(x, y);
}
}
public static void qiu(int x, int y) {
int t=0;
int max=x;
int min=y;
int r=max%min;
if(r==0){
t=max/min;
System.out.println("最大公约数为:"+min);
System.out.println("最小公倍数为:"+(x*y)/min);
}
else {
while(r!=0){
t=max/min;
r=max%min;
max=min;
min=r;
}
System.out.println("最大公约数为:"+max);
System.out.println("最小公倍数为:"+(x*y)/max);
}
}
}
控制台输入:12 15
15
最大公约数为:3
最小公倍数为:60