三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数「建议收藏」

三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数「建议收藏」第二次作业题目:求两个正整数的最大公约数和最小公倍数。基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。提高要求:1.三种以上算法解决两个正整数最大公约数问题。          2.求3个正整数的最大公约数和最小公倍数。一.算法分析    已知结论:a,b的最大公约数*其最小公倍数=a…

大家好,又见面了,我是你们的朋友全栈君。

第二次作业

题目:求两个正整数的最大公约数和最小公倍数。

基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。

提高要求:1.三种以上算法解决两个正整数最大公约数问题。

                   2.求3个正整数的最大公约数和最小公倍数。

一. 算法分析

        已知结论:a,b的最大公约数 * 其最小公倍数 = a * b;

如下介绍的三个算法只针对于求解最大公约数,最小公倍数就由上面结论可以得出。

求解两个数的最大公约数算法流程图:

三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数「建议收藏」

求两个数最小公倍数的算法流程图:

三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数「建议收藏」

 

1.辗转相除法(两个数)

用辗转相除法求两个数的最大公约数的步骤如下:

1.先用小的一个数除大的一个数,得第一个余数;

2.再用第一个余数除小的一个数,得第二个余数;

3.又用第二个余数除第一个余数,得第三个余数;

4.逐次用后一个数去除前一个余数,直到余数是0为止。那么,最后一个除数就是所求的最大公约数;

5. 输出最大公约数和最小公倍数。

2.辗转相除法(三个数)

如果求三个数的最大公约数,可以先求两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数。这样依次下去,直到最后一个数为止。最后所得的一个最大公约数,就是所求的几个数的最大公约数。

3.穷举法(两个数)

用穷举法求解两个数的最大公约数步骤如下:

1. 输入两个正整数;

2. i = a(或b);

3. 若a,b能同时被i整除,则i即为最大公约数,即max = i,结束;

4. 否则i–,再回去执行2;

5.输出最大公约数和最小公倍数。

4.相减法(两个数)

1.输入两个正整数a和b;

2.如果a > b,则a = a – b;

3.如果a < b,则 b = b – a;

4.如果a = b,则a(或b)即为两数的最大公约数

5.如果a ≠ b,则重复执行1;

6.输出最大公约数和最小公倍数。

 

二.源代码

/**
 * 第二次作业
        题目:求两个正整数的最大公约数和最小公倍数。
        基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
        提高要求:1.三种以上算法解决两个正整数最大公约数问题。
          2.求3个正整数的最大公约数和最小公倍数。
        三种方法:相减法;  穷举法;  辗转相除法
        利用穷举法计算三个数的最小公倍数和最大公约数
 */
package program;
import java.util.Scanner;

class Calculate{
	private int num1;   //需要求解的第一个数据
	private int num2;   //需要求解的第二个数据
	
	//构造方法
	public Calculate() {}
	
	//相减法计算两个数的最大公约数和最小公倍数
	void sub(int num1, int num2) {
		int x, y;  //用于保存num1,num2初始数据
		x = num1;  
		y = num2;
		while(num1 != num2) {           //循环条件为两数不相等
			if(num1 > num2)             //如果第一个数大于第二个数
				num1 = num1 - num2;     //两数相减
			else
				num2 = num2 - num1;
		}
		System.out.println("---------------------------------");
		System.out.println("利用相减法计算所得的最大公约数为:"+ num1);     //最大公约数
		System.out.println("利用相减法计算所得的最小公倍数为:"+ x*y/num1);    //最小公倍数
		System.out.println("---------------------------------");
	}
	
	//穷举法求解两个数的最大公约数和最小公倍数
	void exp(int num1, int num2) {
		int  x, y, i;
		x = num1;
		y = num2;
		int max = 0;    //最大公约数
		for(i=1; i<=num1; i++) 
			if(num1%i == 0 && num2%i == 0) 
				max = i;
		System.out.println("---------------------------------");
		System.out.println("利用穷举法计算所得最大公约数为:"+max);
		System.out.println("利用穷举法计算所得最小公倍数为:"+ x*y/max);	//最小公倍数
		System.out.println("---------------------------------");
	}
	
	//辗转相除法求解两个数的最大公约数和最小公倍数
	void divide(int num1, int num2) {
		int r,x,y;    //r表示两个数的余数
		x = num1;
		y = num2;
		//如果两个数前者<后者,则互换两个数
		if(num1 < num2) {
			r = num1;
			num1 = num2;
			num2 = r;
		}
		while(num2 != 0) {   //逐次用后一个数去除前一个余数
			r = num1;
			num1 = num2;
			num2 = r%num2;
		}
		System.out.println("---------------------------------");
		System.out.println("利用辗转相除法计算所得的最大公约数为:"+num1);
		System.out.println("利用辗转相除法计算所得的最小公倍数为:"+ x*y/num1);
		System.out.println("---------------------------------");
	}
	
	//方法的重载
	//利用穷举法计算三个数的最大公约数和最小公倍数
	void exp(int num1, int num2,int num3) {
		int max, min;   
		int i, j;             //保存最终的最大公约数和最小公倍数
		if(num1 < num2) {       
			min = num1;
			max = num2;
		}
		else {
			min = num2;
			max = num1;
		}
		if(min > num3) {
			min = num3;           //计算三个数中的最小数
		}
		if(max < num3) {          //求三个数中的最大数
			max = num3;
		}
		for(i=min; i<=min; i--) {
			if(num1%i==0 && num2%i==0 && num3%i==0) {      //当三个数同时被i整除,此时i为三个数对的最大公约数
				break;
			}
		}
		for(j=max;;j++) {
			if(j%num1==0 && j%num2==0 && j%num3==0) {      //当j能被三个数同时整除,j为三个数的最小公倍数
				break;
			}
		}
		System.out.println("计算三个数所得的最大公约数为:"+i);
		System.out.println("计算三个数所得的最小公倍数为:"+j);
	}
}
public class TestNum {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		System.out.println("请输入需要计算的数据的个数(2 or 3):");     //从键盘输入需要计算的数据的个数,两个数或者三个数
		int type = s.nextInt();
		switch (type) {            
		case 2:
			twoNum();      //计算两个数的最大公约数和最小公倍数
			break;        

		case 3:
			threeNum();    //计算三个数的最大公约数和最小公倍数
			break; 
		}
	}

	//利用三种方法计算两个数的最大公约数和最小公倍数
	static void twoNum() {
		Scanner s = new Scanner(System.in);
		System.out.println("请输入需要计算的正整数:");     //从键盘输入两个数a, b
		int a = s.nextInt();
		int b = s.nextInt();
		Calculate c1 = new Calculate();             //创建一个Calculate的对象 c1
		c1.divide(a, b);                       //调用divide方法(辗转相除法)计算
		c1.sub(a, b);                          //调用sub方法(相减法)计算
		c1.exp(a, b);                          //调用exp方法(穷举法)计算
	}
	
	//利用穷举法计算三个数的最大公约数和最小公倍数,效率不高
    static void threeNum() {
    	Scanner s = new Scanner(System.in);
		System.out.println("请输入需要计算的正整数:");     //从键盘输入两个数a, b
		int a = s.nextInt();
		int b = s.nextInt();
		int c = s.nextInt();
		Calculate c2 = new Calculate();      //创建一个Calculate的对象 c2
		c2.exp(a, b, c);                     //调用exp方法(穷举法)计算
	}

	
}

三.运行结果

1. 当计算两个数的最大公倍数和最小公倍数的结果,由三种算法得出的结果

三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数「建议收藏」

2. 利用穷举法计算三个数的最大公约数和最小公倍数的结果

三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数「建议收藏」

四.学习心得

1.深入学习了利用不同的算法来解决求解两个正整数的最大公约数和最小公倍数,还掌握了利用穷举法计算三个数的最大公约数和最小公倍数,利用穷举法计算的效率比较低,本来自己试着尝试用递归的方法调用divide()方法来求解三个数的问题,尝试了利用数组进行输入信息的保存,同时利用Array.sort()函数进行排序,但是由于参数调用的问题始终无法得到正确的结果。以后可以进行深入的学习。

2.通过解决此问题让我更加深刻的理解了代码规范的重要性,很多次错误都是出在多或者少“{}”上面,浪费了大量的时间。

3.我是利用Java来编写代码的,最开始一股脑全部写在了main方法中,没有充分体现Java语言的特点,慢慢自己也注意到了,对部分代码进行了封装,比之前的程序看起来好看一些,可读性也相对好一些,不过还是要不断完善和学习。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145602.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是java单例模式?[通俗易懂]

    什么是java单例模式?[通俗易懂]关于java单例模式的文章早已是非常多了,本文是对我个人过往学习java,理解及应用java单例模式的一个总结。此文内容涉及java单例模式的基本概念,以及什单例模式的优缺点,希望对大家有所帮助。什么是java单例模式?单例模式是保证类的实例是单例的一种常见设计模式。单例模式的优点:(1)首先肯定是节省内存资源,不管多频繁的通过暴露的方法创建实例,都能保证创建的对象在系统内存中是同一实例对象;(2)灵活性,由于所有实例的创建都由该类控制,所有该类可以灵活的更改实例化过程;(3)实例的

    2022年8月11日
    4
  • django笔记_django 异步

    django笔记_django 异步前言Django是一个开放源代码的Web应用框架,由Python写成,最初用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站,即CMS(内容管理系统)软件,于2005年7月在BSD许可证下发布,这

    2022年8月7日
    3
  • 【Linux + Makefile】Makefile中的.PHONY作用以及赋值运算(各种=符号)的区别

    【Linux + Makefile】Makefile中的.PHONY作用以及赋值运算(各种=符号)的区别【Linux+Makefile】Makefile中的.PHONY作用以及赋值运算(各种=符号)的区别,本文带你了解一下!

    2022年6月14日
    29
  • VMware许可证过期_windows许可证过期什么原因

    VMware许可证过期_windows许可证过期什么原因激活密钥VMware2017v14.x永久许可证激活密钥FF31K-AHZD1-H8ETZ-8WWEZ-WUUVACV7T2-6WY5Q-48EWP-ZXY7X-QGUWD这表文章解决了大部分的常见问题,大家可以去看看http://www.zdfans.com/5928.html

    2022年9月14日
    0
  • SSH实现远程控制

    SSH(SecureShell)是一种能够提供安全远程登录会话的协议,使用ssh可以在远程linux中执行命令。sshd服务提供两种安全验证的方法:(1)基于口令的安全验证:经过验证帐号与密码即

    2021年12月28日
    43
  • 理解VUE响应式原理[通俗易懂]

    理解VUE响应式原理[通俗易懂]1、响应式原理基础响应式原理基础是基于Object.defineProperty(obj,prop,descriptor),descriptor里面可以定义get和set方法,可以在获取属性值事触发get方法(可以收集依赖),设置属性值时触发set方法(更新依赖)。扩展:上面是vue2.0的基础原理,vue3.0的基础原理是:2、核心对象:Dep与WatcherDep:vue在data里申明的每一个属性都会生成一个Dep的实例对象,De…

    2022年4月30日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号