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

一.求N个数的最大公因数和最小公倍数

二.算法设计

  1. 先输入一组数据
    使用listNumber集合实现对数据的存储
  2. 求出最大公因数
    2.1)首先找出所输入数据中的最小值
    2.2)然后再将集合中都能被同一个数整除的数记录下来得到list集合
    2.3)得到list集合后就能找到其最大值就是最大公因数
  3. 求出最小公倍数
    3.1)将listNumber集合中的每个元素与最大公因数求商,将商存入到list中
    3.2)将list中的每个元素相乘,得到的乘积与最大公因数相乘之后得到的就是最小公倍数

三.流程图
在这里插入图片描述

四.测试
在这里插入图片描述
五.调试

1)在计算最大公因数的地方出现差错
在这里插入图片描述

2)在最小公倍数的地方出现差错
在这里插入图片描述

六.心得体会

这次的作业虽然在代码难度上不是很有难度,但是在程序的调试和流程图的绘画上也着实费了一番功夫,不过最后自己能够调试程序,也还是颇有收获的,在eclipse中,f5快捷键进入下个程序,f6执行下一行的代码,f8从当前断电执行到下一个断点···的确,在学会使用断点调试程序的确比自己在那瞎看的确快很多。感觉自己在这次代码中,能够有意识去添加注释。这应该也是第一次使用比较规范的画图软件进行流程图的制图,虽然代码写成来,但是要把流程图那么完美的画下来也不是一件比较容易的事。流程图还需要再多多练习。


public static void main(String[] args) {				  
     //从键盘中输入你想输入的数据		
     Scanner scan = new Scanner(System.in);		
     //创建一个ArrayList集合,用来接受用户输入的数据。		
     ArrayList<Integer> listNumber = new ArrayList<>();		
     System.out.println("请输入您想输入的任意个正整数!");		
     System.out.println("在输入过程中,请您输入一个数据一个(空格键/Tab键/回车键)再进行下个数据的输入");		
     System.out.println("如果您想结束数据的输入,请输入-1,再按回车键即可结束");	
     while(true) {		  
          int num = scan.nextInt();		  
          if(num==-1) {		      
              break;		  
          }
          listNumber.add(num);		
     }		
     System.out.println("您输入的数据总公有:" + listNumber.size() + "个");				
     int gcd = calculateGcd(listNumber);//调用最大公因数的方法,可得到最大公因数		
     int lcm = calculateLcm(listNumber,gcd);//调用最小公倍数的方法,可得到最小公倍数				
     System.out.println("该组数据的最大公因数是:" + gcd);		
     System.out.println("该组数据的最小公倍数是:" + lcm);	
}



//得到最大公因数的方法
public static int
calculateGcd(ArrayList<Integer> listNumber) {		
     //用list集合来存储都能被listNumber集合中的数整除的数
     ArrayList<Integer> list = new ArrayList<>();
     /*		 
     * 找到listNumber集合中最小的数	    
     */
     int min;//定义一个用来存储listNumber集合中最小数的变量
     min = listNumber.get(0);//将listNumber集合中的第一个元素赋值给min		    
     for(int i=1;i<listNumber.size();i++) {//循环1——listNumber.size()次
        int num = listNumber.get(i);//得到listNumber集合中每个数			
  	    if(min>num) {//与min作比较,如果min中的数小于num中的数				
  	    min = num;//将num中的数赋值给min			
  	    }		
  	 }		
  	 /*
  	 * 找到所有都能被listArrayList集合中每个整除的数		
  	 */		
  	  int i =2;		
  	  while(i<=min) {//从2循环到min次 
  	  for(int j=0;j<listNumber.size();j++){				 
  	     int num = listNumber.get(j);//得到listNumber集合中每个数			
  	     if((num%i)!=0) {//如果i这个数不能被num整除,则证明i不是num的因数,就排除i,进行下一次的循环					 
  	         break;				
  	     }            
  	     if(num==listNumber.get(listNumber.size()-1)) {//判段num与listNumber集合中的最后一个元素是否相等				    
            list.add(i); //进行到这里就可以得到listNumber集合中每个元素都能被i整除,将i加入到list集合中,就可以得到它们的公共因数
         }		   
       }			
       i++;		
     }	
         /*	
         * 找到list集合中最大的元素就是最大公因数		  
         */		
     int gcd =list.get(0);//将list集合中的第一个元素赋给gcd		
     for(int k=1;k<list.size();k++) {			
         int num = list.get(k);//得到list中的每个数			
         if(gcd<num) {//与gcd进行比较,如果gcd小于num				
         gcd=num;//就将num赋值给gcd;			
         }		
      }	
     return gcd ;//返回gcd的值就是该组数中的最大公因数	
}






//得到最小公倍数的方法
public static int calculateLcm(ArrayList<Integer> listNumber, int max) {				
     //用来存储listNumber集合中的每个元素与最大公因素的商		
     ArrayList<Integer> list = new ArrayList<>();		
     int clm =1;//定义一个用来存储最小公倍数的变量		
     for(int i=0;i<listNumber.size();i++) {			
          int num =listNumber.get(i);//分别得到listNumber集合中的每个元素			
          list.add(num/max);//将每一个数与最答公因数的商存储在list集合中		}				
     for(int i=0;i<list.size();i++) {			  
           int num = list.get(i);//分别得到list集合中的每个元素			
           clm *= num;//将list集合中的所有元素相乘		
      }		
      clm = clm * max;//最后将所有的积与最大公因数相乘即可得到最大公倍数		
      return clm;//返回最大公倍数就为所求的值	
}	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值