欧几里得算法代码实现
欧几里得算法代码实现
1,我们仍然用类Scanner完成对两个整数的输入;
2,接着,用EuclidMethod这个函数来计算最大公约数;
3,最后用show展示结果。
主要流程就是这三步:
输入->计算最大公约数->展示
而EuclidMethod计算最大公约数的实现,首先我们知道需要输入两个整数,然后计算出来一个整数;消费2个int,产生1个int
这个函数的是这样的:\((int,int)\rightarrow int\)
那么它的签名就会有这样的形式,在参数变量那里2个int,返回值1个int,然后根据不同的编程语言的语法,会有一些差异,但是形式是差不多的。 $ ... int \quad EuclidMethod(int ...,int...)$
import java.util.Scanner;
public class EuclidGreatestFactor {
public static void main(String argv[])
{
Scanner input = new Scanner(System.in); //用类Scanner完成输入部分
while(true) {
int N1 = input.nextInt(); // 自然数N1
int N2 = input.nextInt(); //自然数N2
int GreatestFactor; //用来保存算出来最大公约数
GreatestFactor = EuclidMethod(N1, N2); //欧几里得方法计算N1,N2的最大公约数,计算完成后保存在GreatestFactor里面
//展示结果
show(N1, N2, GreatestFactor);
}
}
public static int EuclidMethod(int N1,int N2) //什么是欧几里得算法
{
int reminder; // 每次用来保存余数的变量
reminder = N1 - N2*(N1/N2);
if(reminder == 0) return N2; // 判断余数是否是0,确定这是不是最后一次迭代,是就返回N2作为结果;
//否则返回下一次迭代
return EuclidMethod(N2,reminder);
}
public static void show(int N1,int N2, int GF)
{
System.out.println(N1 +" 和"+N2+"的最大公约数是"+GF );
}
}
在完成函数EuclidMethod,我按上一节提到的,先计算余数,判断余数是否是0来确定这是不是最后一次迭代,是就返回,不是就继续下一次迭代这种方式来直接用java翻译这个算法。当然可以写得简洁,如果用mod运算;
public static int EuclidMethod2(int N1,int N2) //什么是欧几里得算法
{
return (N1%N2==0)?N2:EuclidMethod2(N2,N1%N2);
}
这里面简洁一些,但是不好理解;这一句话和上面那个思路上没有区别。
就是用mod(%)运算和三目判断符(?:)简化了一下写法。少了变量reminder的存储,但是用计算了一次\(N1\%N2\)。你说用计算力换存储,这是这种写法的目的吧,现代计算机在存储使用上受限?这又是另外一个问题了。