题目五: 输入两个正整数 m 和 n,求最大公约数
A.辗转相除法
1.核心思想
前提:被取余数%取余数=余数
a.第一次,拿大数%小数=余数
b.从第二次起,每次取余数部分(小数)就当成新一轮取余运算的被取余数,余数就当成新一轮取余运算的取余数
c.当被取余数%取余数=0时,此时找到最大公约数,其最大公约数=取余数,否则执行下一轮取余运算
2.核心代码
if(m>n){
//被除数变为除数,除数变为余数
temp03=temp01%temp02;
result=temp02;
//当temp03=0时,代表temp02是最大公约数
temp01=temp02;
temp02=temp03;
}else{
temp03=temp02%temp01;
result=temp01;
temp02=temp01;
temp01=temp03;
}
//其中tempo1=m,temp02=n,temp03用于存放余数,result用来接收所产生的最大公约数
3.常见问题点分析
3.1 布尔类型变量flag与布尔类型变量flag01的作用分别是什么?
解答:flag的作用: 判断是否输入合法,若输入合法就进入求公约数算法阶段,此时flag=false,保证程序在求完公约数之后能顺利结束.若非法则提示重新输入,程序不会结束
flag01的作用:判断最大公约数是否求解完毕,若求解完毕,求输出公约数,并使flag01=false,退出当前求最大公约数这个循环,否则,则进入继续求公约数的取余阶段
3.2 为啥要判断正整数m与正整数n的大小关系?
解答:辗转相除法要求的是大数%小数,要保证每次大数在被取余数部分。
正整数m,正整数n之间的大小关系没有要求,
3 运行截图
3.1 第一次输入m<=0且第二次时输入时m>0且m<n
3.2 第一次输入n<=0且第二次时输入时n>0且m>=n
3.3 第一次输入时,m>0且m<n;
3.4 第一次输入时,n>0且m>=n;
4.源代码
import java.util.Scanner;
public class Gcd{
public static void main(String[] args) {
//GCD中的G代表greatest c代表common d代表divisor(因子)
System.out.println("题目五:输入正整数m和n,求最大公约数----辗转相除法");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入正整数m:");
int m=scanner.nextInt();
System.out.println("请输入正整数n:");
int n=scanner.nextInt();
boolean flag=true;
//flag用于判断用户输入值是否正确,
// 若不正确,就要求你重新输入,否则flag=false,进入公约数判断
while(flag){
if(m>0&&n>0){
flag=false;
boolean flag01=true;
int temp01=m,temp02=n;
int result=0;
//result是用来接受最大公约数的
while(flag01){
int temp03=0;
if(m>n){
//被除数变为除数,除数变为余数
temp03=temp01%temp02;
result=temp02;
//当temp03=0时,代表temp02是最大公约数
temp01=temp02;
temp02=temp03;
}else{
temp03=temp02%temp01;
result=temp01;
temp02=temp01;
temp01=temp03;
}
//flag01判定是否产生最大公约数,若产生,则退出循环
if(temp03==0){
flag01=false;
System.out.println("最大公约数为:"+result);
}
}
}else{
System.out.println("输入有误,请检查输入的m值和n值");
System.out.println("请再次输入正整数m:");
m=scanner.nextInt();
System.out.println("请再次输入正整数m:");
n=scanner.nextInt();
}
}
}
}
B.辗转相减法
1.核心思想
前提:被减数-减数=差
a.第一次,拿大数-小数=差
b.从第二次起,每次拿减数与差进行大小的比较,使较大值为被减数,较小值为差
c.当差为0时,此时找到最大公约数,其最大公约数=被减数,否则执行下一轮减法运算
2.核心代码
if(temp01>temp02){
temp03 = temp01 - temp02;
if (temp03 > temp02) {
temp01 = temp03;
}else if (temp03 < temp02) {
temp01 = temp02;
temp02 = temp03;
// result = temp01;
}else {
result=temp03;
//当减数与差相等,意味着此时就是最大公约数
flag01 = false;
System.out.println("最大公约数为:" + result);
}
}else{
temp03 = temp02 - temp01;
if (temp03 > temp01) {
temp02 = temp03;
}else if (temp03 < temp01) {
temp02 = temp01;
temp01 = temp03;
}else {
result=temp03;
//当减数与差相等,意味着此时就是最大公约数
flag01 = false;
System.out.println("最大公约数为:" + result);
}
}
3.常见问题点分析
3.1 布尔类型变量flag与布尔类型变量flag01的作用分别是什么?
解答:flag的作用: 判断是否输入合法,若输入合法就进入求公约数算法阶段,此时flag=false,保证程序在求完公约数之后能顺利结束.若非法则提示重新输入,程序不会结束
flag01的作用:判断最大公约数是否求解完毕,若求解完毕,求输出公约数,并使flag01=false,退出当前求最大公约数这个循环,否则,则进入继续求公约数的取余阶段
3.2 为啥当差值与减数相等时,此时最大公约数为差值?
解答:辗转相除法的核心是当被减数-减数=0时,可以推导出以下结论
最大公约数=差值=减数
因此当差值和减数相等时,最大公约数为差值
3 运行截图
3.1 第一次输入m<=0且第二次时输入时m>0且m<n
3.2 第一次输入n<=0且第二次时输入时n>0且m>=n
3.3 第一次输入时,m>0且m<n;
3.4 第一次输入时,n>0且m>=n;
4.源代码
import java.util.Scanner;
public class Gcd01 {
public static void main(String[] args) {
//GCD中的G代表greatest c代表common d代表divisor(因子)
System.out.println("题目五:输入正整数m和n,求最大公约数----辗转相减法");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入正整数m:");
int m = scanner.nextInt();
System.out.println("请输入正整数n:");
int n = scanner.nextInt();
boolean flag = true;
//flag用于判断用户输入值是否正确,
// 若不正确,就要求你重新输入,否则flag=false,进入公约数判断
while (flag) {
if (m > 0 && n > 0) {
flag = false;
boolean flag01 = true;
int temp01 = m, temp02 = n;
int result = 0;
//result是用来接受最大公约数的
while (flag01) {
int temp03 = 0;
if(temp01>temp02){
temp03 = temp01 - temp02;
if (temp03 > temp02) {
temp01 = temp03;
// result = temp02;
}else if (temp03 < temp02) {
temp01 = temp02;
temp02 = temp03;
// result = temp01;
}else {
result=temp03;
//当减数与差相等,意味着此时就是最大公约数
flag01 = false;
System.out.println("最大公约数为:" + result);
}
}else{
temp03 = temp02 - temp01;
if (temp03 > temp01) {
temp02 = temp03;
}else if (temp03 < temp01) {
temp02 = temp01;
temp01 = temp03;
}else {
result=temp03;
//当减数与差相等,意味着此时就是最大公约数
flag01 = false;
System.out.println("最大公约数为:" + result);
}
}
}
}else{
System.out.println("输入有误,请检查输入的m值和n值");
System.out.println("请再次输入正整数m:");
m = scanner.nextInt();
System.out.println("请再次输入正整数m:");
n = scanner.nextInt();
}
}
}
}