求N个数的最大公约数和最小公倍数

求N个数的最大公约数和最小公倍数

题目要求

求N个数的最大公约数和最小公倍数,用java实现

算法设计

1.输入N个数
2.将输入的数与数的多少输出
3.最后一个数与前一个数进行辗转相除以计算最大公约数
	3.1得出的结果再次与前一个数进行辗转相除
	3.2当计算到最后一个数时返回最终的N个数的最大公约数
4.最后一个数与前一个数的乘积除以这两个数的最大公约数以计算最小公倍数,
  得出的结果再次递归调用上述方法
	4.1当计算到最后一个数时返回最终的N个数的最小公倍数
5.输出得到的最大公约数与最小公倍数

算法流程图

代码

/**
 * @title:Work 
 * @description : 基础要求
 * @author : 薛凯旋
 * @data: 2020年3月30日下午4:06:49
 */
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Work {
 
 /**
  * 辗转相除法来计算两个数的最大公因数
  * @param a 其中一个数
  * @param b 其中另一个数
  * @return 返回最大公约数
  */
 static int divisor(int a ,int b) {
  if(a < b) {   //要用大的数除以小的数,提前进行判断
   int temp = a;
   a = b;
   b = temp;
  }
  
  int c = a % b;
  while(c !=0 ) {
   a = b;
   b = c;
   c = a % b;
  }
  return b;
 }
 
 static int divisorResult(List<Integer> arr ,int l) {
  if(l == 1) { return arr.get(0); } //返回N个数的最大公约数
        return divisor(arr.get(l - 1) , divisorResult(arr , l - 1)); //递归调用,两个数两个数的求
 }
 
 /**
  * 两个数的乘积的值等于这两个数的最小公倍数和最大公因数的乘积的值
  * 利用这个性值来计算两个数的最小公倍数
  * @param a 其中一个数
  * @param b 其中另一个数
  * @return 返回两个数的最小公倍数
  */
 static int multiple(int a ,int b) {
  return (a * b) / divisor(a, b);
 }
 
 static int multipleResult(ArrayList<Integer> arr, int l) {
  if(l == 1) { return arr.get(0); } //返回N个数的最小公倍数
  return multiple(arr.get(l - 1), divisorResult(arr, l - 1)); //递归调用,两个数两个数的求
 }
 
 public static void main(String[] args) {
  
  ArrayList<Integer> arr = new ArrayList<Integer>(); //定义存储N个数的动态容器
  System.out.println("请输入N个非0数(按回车结束):");
  Scanner in = new Scanner(System.in);  
   String line = in.nextLine();  
    Scanner enter = new Scanner(line);   //用于接收字符串的Scanner
    while(enter.hasNextInt()){
       arr.add(enter.nextInt());
   }
    System.out.println("输入了"+arr.size()+"个数,分别为:"+arr); //将N个数字输出
    System.out.println("这"+arr.size()+"个数的最大公约数为:"+divisorResult(arr, arr.size()));
    System.out.println("这"+arr.size()+"个数的最小公倍数为:"+multipleResult(arr, arr.size()));
 
    in.close();
    enter.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值