第二次作业

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

基本要求: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;     //两数相减elsenum2 = 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, bint a = s.nextInt();int b = s.nextInt();Calculate c1 = new Calculate();             //创建一个Calculate的对象 c1c1.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, bint a = s.nextInt();int b = s.nextInt();int c = s.nextInt();Calculate c2 = new Calculate();      //创建一个Calculate的对象 c2c2.exp(a, b, c);                     //调用exp方法(穷举法)计算}}

三.运行结果

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

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

四.学习心得

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

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

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

三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数相关推荐

  1. js求两圆交点_详解js实现线段交点的三种算法

    本文讲的内容都很初级, 主要是面向和我一样的初学者, 所以请各位算法帝们轻拍啊 引用 已知线段1(a,b) 和线段2(c,d) ,其中a b c d为端点, 求线段交点p .(平行或共线视作不相交) ...

  2. C语言求最小公倍数和最大公约数三种算法(经典)

    C语言求最小公倍数和最大公约数三种算法(经典) 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为 ...

  3. 求最大公因数的三种算法及简要说明

    求最大公因数的三种算法及简要说明 1.连续整数法 从给定的最小的数开始按1递减,直至找到一个能被两者都整除的数. public static int gcd1(int x, int y){int mi ...

  4. c语言求出两个最大素数,求两个正整数的最大公约数      思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y...

    求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) ( ...

  5. c语言求最小公倍数和最大公约数三种算法

    C语言求最小公倍数和最大公约数三种算法(经典) 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b ...

  6. 求一个数的二进制中有多少了 1 的三种算法 ——Java篇

    求一个数的二进制中有多少了 1 的三种算法 --Java篇 文章目录 求一个数的二进制中有多少了 1 的三种算法 --Java篇 算法一:通过取模 % 运算就取出每一比特位数值,再判断 思路: 代码: ...

  7. 两数之和(JavaScript三种算法)

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target  的那 两个整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个 ...

  8. 判断两条直线是否相交c语言,计算几何-两条线段是否相交(三种算法)

    原标题:计算几何-两条线段是否相交(三种算法) 计算几何中,判断线段是否相交是最基本的题目. 所谓几何, 最基本的当然就是坐标, 从坐标中我们可以知道位置和方向,比如:一个点就是一个位置,两点确定一条 ...

  9. java 求最大公因数_求最大公约数的三种算法(java实现)

    三种算法: //欧几里得算法(辗转相除): public static int gcd(int m,int n) { if(m int k=m; m=n; n=k; } //if(m%n!=0) { ...

最新文章

  1. 极视教育的课程怎么样_蒲公英教育加盟怎么样?
  2. python填写excel-Python玩转Excel的读写改实例
  3. 如何在linux下判断web服务是否开启?
  4. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
  5. canvas滚动 vue_vue 移动端 canvas 触摸板
  6. 深入理解K8S网络原理下
  7. 对信号与系统课程中Python语言的作业
  8. 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。
  9. python 包之 Pygame 游戏开发教程
  10. 电信光猫-华为HG8245C获取超级管理员密码
  11. 怎么卸载mysql_mysql卸载教程,教你如何彻底卸载MySQL数据库软件(亲测成功)
  12. Javascript飘窗代码
  13. 扬州鉴真国际半程马拉松
  14. python借助OpenCC实现中文繁体转简体
  15. Yesterday Once More(昨日重现)
  16. 金钱找零问题,招行笔试题
  17. android 关机界面修改,修改Android关机界面
  18. c语言中的return 0有什么用?
  19. android 直播悬浮窗口,实战:快手直播伴侣 解决安卓悬浮窗/闪退等问题
  20. 3DMAX一键屋顶建模插件MW RoofGen使用教程

热门文章

  1. ifconfig安装
  2. redis crackit入侵事件总结
  3. c++在csv写入汉字_python-opencv表格识别转csv
  4. 域账号创建、组创建,域账号加入组,客户端登陆域账号
  5. web audio api 实现音频播放
  6. Outlook2019关联163邮箱
  7. python 使用pdfminer3k 读取PDF文档
  8. 万字长文带你探究 Docker 容器化技术背后的黑科技
  9. R语言运行环境安装配置
  10. mysql下载32位安装教程_MySQL下载安装教程