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

三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数「建议收藏」第二次作业题目:求两个正整数的最大公约数和最小公倍数。基本要求: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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux常用命令50个_docmd常用命令详解

    linux常用命令50个_docmd常用命令详解1. find基本语法参数如下:find[PATH][option][action]#与时间有关的参数:-mtimen:n为数字,意思为在n天之前的“一天内”被更改过的

    2022年8月2日
    7
  • 业务安全(逻辑漏洞)

    业务安全(逻辑漏洞)文章目录业务安全概述黑客攻击的目标业务安全测试流程测试准备业务调研业务建模业务流程梳理业务风险点的识别开展测试撰写报告业务数据安全商品支付金额篡改前端JS限制绕过验证请求重放测试业务上限测试商品订购数量篡改damiCMSV5.1为例密码找回安全验证码客户端回显测试验证码暴力破解Response状态值修改测试Session覆盖弱token设计缺陷测试密码找回流程绕过测试接口参数账号修改metinfoV4.0为例业务安全概述近年来,随着信息化技术的迅速发展和全球一体化进程的不断加快,计算机和网

    2022年6月5日
    40
  • oracle的游标 sql语句,sql游标

    oracle的游标 sql语句,sql游标sql游标游标的类型:1、静态游标(不检测数据行的变化)2、动态游标(反映所有数据行的改变)3、仅向前游标(不支持滚动)4、键集游标(能反映修改,但不能准确反映插入、删除)游标使用顺序:1、定义游标2、打开游标3、使用游标4、关闭游标5、释放游标Transact-SQL:declare游标名cursor[LOCAL|GLOBAL][FORWARD_ONLY|SCROLL][STATI…

    2022年7月27日
    5
  • 通俗、有逻辑的写一篇说下Xgboost的原理,供讨论参考

    通俗、有逻辑的写一篇说下Xgboost的原理,供讨论参考初看Xgboost,翻了多篇博客发现关于xgboost原理的描述实在难以忍受,缺乏逻辑性,写一篇供讨论。——以下是抛砖引玉。观其大略,而后深入细节,一开始扎进公式反正我是觉得效率不高,还容易打消人的积极性。首先说下决策树决策树是啥?举个例子,有一堆人,我让你分出男女,你依靠头发长短将人群分为两拨,长发的为“女”,短发为“男”,你是不是依靠一个指标“头发长短”将人群进行了划分,你就形成了一个

    2022年5月7日
    45
  • Java快速入门

    Java快速入门1Java简介太阳计算机系统(中国)有限公司1982年成立2009年被Oracle收购甲骨文股份有限公司1977年成立2013年成为全球第二大软件公司詹姆斯·高斯林(JamesGosling)Java编程语言的共同创始人之一一般公认他为“Java之父”1.1Java发展史20世纪90年代,出现了单片机。1991年,Sun公司成立了Green项目小组,专攻家电产品上的嵌入式应用,开发出了一种称为Oak的面向对象语言。1992年,Oak语言开发成功后,因为缺

    2022年6月5日
    30
  • 阻容降压电路[通俗易懂]

    阻容降压电路[通俗易懂]阻容降压电路(适合于小功率小电流负载)示例分析:下图中,C1为降压电容,一般为0.33-3.3uF。在此设为C1=2uF,整流管的导通电阻通常为几欧姆,稳压管VS的动态电阻为10欧姆左右,限流电阻R1及负载电阻RL一般为100-200欧姆,滤波电容一般为100uF-1000uF,其容抗可忽略。因此,可将图1电路等效为图2的交流电路,且满足容抗XC1&amp;amp;gt;R的条件。电容C1的容抗XC1…

    2022年6月20日
    31

发表回复

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

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