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

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

本次课题的基本要求:
求N个数的最大公约数和最小公倍数。(用C或C++或java或python语言实现程序解决问题。)
1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证

本次课题的提高要求:
Hanks博士是BT (Bio-Tech, 生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考- - -个有趣的问题。今天在课堂上,老师讲解了如何求两个正整数c1和c2的最大公约数和最小公倍数。现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考-一个“求公约数"和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足:
1、x和a0的最大公约数是a1;
2、x和b0的最小公倍数是b1。
Hankson的“逆问题"就是求出满足条件的正整数x。但稍加思索之后,他发现这样的x并不唯–,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x的个数。请你帮助他编程求解这个问题。

输入格式:
输入第一行为一个正整数n,表示有n组输入数据°接下来的n行每行一-组输入数据,为四个正整数a0, a1, b0, b1,每两个整数之间用一个空格隔开。输入数据保证a0能被a1整除,b1能被b0整除。输出格式输出共n行。每组输入数据的输出结果占- -行,为一个整数。对于每组数据:若不存在这样的x, 请输出0;若存在这样的x,请输出满足条件的x的个数;

样例输入
2
41196288
951 371776
样例输出
6
2

数据范围与约定
对于50%的数据,保证有1sa0, a1, b0, b1≤10000 且ns100。
对于100%的数据,保证有1≤a0,a1, b0, b1s2,00,000,000且ns2000。
样例解释
第一组输入数据,xx 可以是9,18,36,72,144,2889,18,36,72,144,288,共有66个。
第二组输入数据,xx 可以是48,177648,1776,共有22个。
说明:
提交电子版作业,压缩文件应包含源文件(不包含工程文件)和作业说明,其中作业说明里面应有算法设计思路(可以在方法注释或文档注释中体现),调试及测试截屏及总结并提供个人博客链接。
源代码:
package lmmm;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**

  • 题目要求:
  • 求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。
  •    1.程序风格良好(使用自定义注释模板)
  •    2.提供友好的输入输出,并进行输入数据的正确性验证
  • 类方法:
  • 方法public static int gcd(int x, int y)是求两个数的最大公约数
  • 方法public static int ngcd(List target , int z) 是求n个数的最大公约数
  • 方法public static int lcm (int x , int y)是求两个数的最小公倍数
  • 方法public static int nlcm (List target , int z)是自n个数的最小公倍数
  • 完成时间:2020年4月2日
  • @author 刘晓阳
  • @version 1.0.0
    /
    public class Pdd {
    /
    *
    • 辗转相除法的递归调用求两个数的最大公约数
    • @param x 其中一个数
    • @param y 其中另一个数
    • @return 递归调用,最终返回最大公约数
      /
      public static int gcd(int x, int y) {
      return y == 0 ? x : gcd(y , x % y);
      }
      /
      *
    • 求n个数的最大公约数
    • @param Listlist n个数的集合
    • @param z 数据个数
    • @return 递归调用,最终返回最大公约数
      /
      public static int ngcd(List target , int z) {
      if(z == 1) {
      return target.get(0);//真正返回的最大公约数
      }
      //递归调用,两个数两个数的求
      return gcd(target.get(z - 1) , ngcd(target , z - 1));
      }
      /
      *
    • 辗转相除法的递归调用求两个数的最小公倍数
    • @param x 其中一个数
    • @param y 其中另一个数
    • @return 递归调用,最终返回最小公倍数
      /
      public static int lcm (int x , int y) {
      return (x * y) / gcd(x , y);
      }
      /
      *
    • 求n个数的最小公倍数
    • @param Listlist n个数的集合
    • @param z 数据个数
    • @return 递归调用,最终返回最小公倍数
      */
      public static int nlcm (List target , int z) {
      if (z == 1) {
      return target.get(z - 1);//真正返回的最小公倍数
      }
      //递归调用,两个数两个数的求
      return lcm(target.get(z - 1) , nlcm(target , z-1));
      }
      public static void main(String [] args) {
      Scanner scanner = new Scanner(System.in);
      int num = 0;//数据个数
      List target = new ArrayList();//数据集合
      System.out.println("------------------------------------------------------------");
      System.out.println(“请输入需要计算最大公约数和最小公倍数的个数:”);
      try {
      num = scanner.nextInt();
      System.out.println(“请输入需要计算最大公约数和最小公倍数的数组:”);
      for (int i = 0; i < num; i++) {
      target.add(scanner.nextInt());
      }
      } catch (Exception e) {
      System.out.println(“输入错误!!!”);
      return ;
      }
      System.out.println("------------------------------------------------------------");
      System.out.println(“最大公约数:” + ngcd(target , num));
      System.out.println(“最小公倍数:” + nlcm(target , num));
      System.out.println("------------------------------------------------------------");
      System.out.println();
      }
      }
      /借鉴了啊哈~博客主的部分代码和思想/

你可能感兴趣的:(任务,java)