文章目录
- 前言
- 一、最大公约数的相关必备
- 二、利用Java实现:方法1暴力破解法(枚举); 方法2辗转相除法; 方法3辗转相减法;
- 总结
前言
通过输入两个自然数输出最大公约数,理解求最大公约数的方法
一、最大公约数的相关必备
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。
质因数分解法
把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。
- 辗转相除法(欧几里德算法)
用辗转相除法求几个数的最大公约数可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
- 更相减损法(等值算法)
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。
最大公约数的英语表达为GCM:greatest common measure
二、利用Java实现
方法1暴力破解法(枚举)
import java.util.Scanner;
public class Method1{
public static void main(String[]args){
Scanner myScanner=new Scanner(System.in);
System.out.println("输入任意一个自然数:");
int num1=myScanner.nextInt();
System.out.println("输入任意一个自然数:");
int num2=myScanner.nextInt();
int ret=0;//记录最大公约数
for (int i= 1; i<=Math.min(num1,num2); i ++) {
if (0== num1 % i && 0== num2 % i) {
ret=i;
}
}
System.out.println("所以("+num1+","+num2+")的最大公约数是: "+ret);
}
}
方法2辗转相除法
import java.util.Scanner;
public class Method2{
public static void main (String []args){
Scanner myScanner=new Scanner(System.in);
System.out.println("输入任意一个自然数:");
int num1=myScanner.nextInt();
System.out.println("输入任意一个自然数:");
int num2=myScanner.nextInt();
int a=num1;
int b=num2;
while (b!=0) {
int m=a % b;
a=b;
b=m;
}
System.out.println("所以("+num1+","+num2+")的最大公约数是: "+a);
}
}
方法3辗转相减法
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println("输入任意一个自然数:");
int a=myScanner.nextInt();
System.out.println("输入任意一个自然数:");
int b=myScanner.nextInt();
while(a!=b) {
if(a>b) {
a=a-b;
}
else {
b=b-a;
}
}
System.out.println( "最大公约数" + a);
}
}
总结
效果呈现
1、辗转方法 : 求两个数的最大公约数,可以用辗转相除法,同样,也可以用辗转相减法(《九章算术》里也叫更相减损术)。一般情况下,辗转相除法的优势在于循环次数少,而辗转相减法的优势在于,对cpu 来说 做减法比除法更快。
2、暴力破解法(枚举):无脑流,最为简单粗暴,也是最容易想到的一种方法。
3、当然其他方法还有,在这里就展示我理解的操作,有其他的方法以后慢慢再练习掌握。