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

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


相关推荐

  • 算法的时间与空间复杂度(一看就懂)

    算法的时间与空间复杂度(一看就懂)算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算…

    2022年5月14日
    28
  • Gamma 校正_gamma校正什么意思

    Gamma 校正_gamma校正什么意思问题:什么是Gamma曲线矫正?Gamma曲线矫正是什么意思?      Gamma曲线是一种特殊的色调曲线,当Gamma值等于1的时候,曲线为与坐标轴成45°的直线,这个时候表示输入和输出密度相同。高于1的Gamma值将会造成输出亮化,低于1的Gamma值将会造成输出暗化。总之,我们的要求是输入和输出比率尽可能地接近于1。在显示器、扫描仪、打印机等输入、输出设备中这是一个相当常见并且比较重

    2022年9月23日
    0
  • python取余还是相乘_python取余还是相乘_基于python 取余问题(%)详解

    python取余还是相乘_python取余还是相乘_基于python 取余问题(%)详解取余的公式:余数=除数-被除数*商python的的余数是按照整除(向下取整)得到的商来计算的。取余问题主要分为:正数与正数,负数与负数,正数与负数,0正数与正数#大数/小数:因为得出的商和整除得出的一致,所以直接按照这个公式(余数=除数-被除数*商)即可。print(9//7)#1print(9%7)#2#小数/大数:因为得出的商和整除得出的一致,所以直接按照这个公式(余数=除数-被除数*…

    2022年5月20日
    38
  • 数据挖掘的9大成熟技术和应用

    数据挖掘的9大成熟技术和应用http://ihoge.cn/2018/DataMining.html数据挖掘的9大成熟技术和应用基于数据挖掘的9大主要成熟技术以及在数据化运营中的主要应用:1、决策树2、神经网络3、回归4、关联规则5、聚类6、贝叶斯分类7、支持向量机8、主成分分析9、假设检验1 决策树决策树(DecisionTree)是一种非常成熟的、普遍采用的数据挖…

    2022年6月15日
    41
  • 关于insertBefore是怎么使用的

    关于insertBefore是怎么使用的insertBefore接收两个参数第一个参数是将要进行插前操作的对象第二个参数是被插前的对象也可以称为参考对象调用者为你要操作的元素的父级如下例:<!DOCTYPE ht

    2022年7月2日
    20
  • gg修改器编写lua脚本怎么搜索和替换

    gg修改器编写lua脚本怎么搜索和替换gg修改器编写lua脚本怎么搜索和替换如果替代是以字节为单位的长度相同。把下方单引号里的汉字换成你想替换的就行了UTF-8编码–UTF-8:search’你要搜索的’,replaceto’你要替换的’gg.require(‘80.0’,15060)gg.clearResults()gg.searchNumber(‘:你要搜索的’)gg.getResults…

    2022年9月5日
    5

发表回复

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

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