输入两个正整数 m 和 n,求最大公约数

题目五: 输入两个正整数 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();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值