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

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


相关推荐

  • mysql怎么批量导入数据_oracle如何批量导入大量数据

    mysql怎么批量导入数据_oracle如何批量导入大量数据1、确定需要导入数据的表名称以及字段,然后在新建的Excel表中,按照表字段正确排序;(注:(Excel文件的名称最好和数据库的名称一致,sheet表的名字最好和表名称一致,方便需要导入多张表数据时一一对应))2、在Excel表中,正确填写需要导入的数据,一行数据对应着数据库表中的一行记录;(注:各个字段的格式要求需要和数据库中的限制一样,避免出现差错)3、收集好需要导入的数据后,点击保存。(注:…

    2025年12月2日
    4
  • 浅谈CAS原理_cas算法原理

    浅谈CAS原理_cas算法原理1.背景我们知道,synchronized就是一种独占锁,独占锁是一个悲观锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一种更加有效的锁就是乐观锁,CAS就是一种乐观锁2.CAS原理CAS(CompareAndSwap),比较并交换。我们知道,如果我要对一个变量进行操作,可以分为三个步骤读取该变量的值进行一系列的运算得到新的结果将运算的结果保存这儿需要知道CAS中有三个概念:内存地址的值V,旧值(从内存地址读取到的值)A,新值(进行操作后的结果值)。对应上面三

    2022年10月9日
    2
  • countdown倒计时安卓软件_倒计时工具

    countdown倒计时安卓软件_倒计时工具CountDownTimer是Android官方SDK提供的一个倒计时工具,其仍然是基于Handlersend/postdelay,可视作在倒计时这个特定的使用场景下对于Handler的一种封装。用法CountDownTimer使用起来是很方便的。CountDownTimer是一个抽象类,通过构造方法创建实例,并且实现两个抽象方法即可。start()方法为启动倒计时。CountDownTime…

    2025年12月8日
    2
  • 逻辑斯蒂回归(Logistic Regression)

    logistic回归logistic回归经常被人译为“逻辑回归“,虽然我个人认为貌似并没有什么关联,但下面就姑且这么叫吧。逻辑回归虽然是名字里带着回归,但其实是一种解决分类问题的算法,说到分类就有分几类的区别,本篇我们只讨论用于二分类问题的逻辑回归。基本的线性回归的形式为:y=ωTx+by=ωTx+by=\omega^{T}x+b线性回归模型产生的预测值是一系列实值。为了使得输…

    2022年4月4日
    45
  • C语言字符串匹配函数建议收藏

    C语言字符串匹配函数,保存有需要时可以用:1#include2#include3#include4#include5#include67/*8pattern:9pos

    2021年12月20日
    43
  • DoJa平台手机游戏的开发与移植

    DoJa平台手机游戏的开发与移植作者:关文柏时间:2006年6月13日关键字:DoJaNTTDoCoMoi-modei-appli内容概况:·DoJa技术简介·DoJaAPI预览·appli程序的开发·DoJa游戏移植到J2ME平台的方法·相关资源链接一,DoJa技术简介简单的说,DoJa是日本最大的移动通讯公司NTTDoCoMo…

    2022年6月5日
    31

发表回复

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

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