第二章作业说明
程序员文章站
2022-07-14 20:01:19
...
一、题目名称:求n个数的最大公约数和最小公倍数
二、题目内容:求N个数的最大公约数和最小公倍数.用C或C++或java或python语言实现程序解决问题。
三、算法设计:
1.利用辗转相除法来求出两个数的最大公约数.
2.将输入的n个数放进数组a[100]中.
3.求解每两个数的最大公约数,最后得到n个数的最大公约数.
4.求出两个数的最大公约数后,若k是a和b的最大公约数,那么a和b的最小公倍数为ab/k.
5.遍历一次数组求出n个数的最小公倍数。.
四、调试与测试:
调试:
测试:
1.测试输入的n<2时的情况
2.测试输入的数有等于0时的情况
3.正常情况
五、遇到的困难及解决方案:
在程序编写的过程中由于才开始学java语言,导致初期各种语法错误,通过在网上查找资料,不断完善程序,同时学习到了java的一些常用语句和语法.
测试时输入了带有0的一组数,导致输出错误.然后就加入了INSPECT()函数来检查输入数据的正确性.
六、源代码
import java.util.Scanner;
public class a {
public static void main(String[] args){
Scanner input= new Scanner(System.in);
int i;
int k=1;
int a[]=new int[100];
System.out.println("本程序是用来计算n个数的最大公约数(gcd)和最小公倍数(lcm)的.");
System.out.println("那么你要求几个数的gcd和lcm呢?");
System.out.println("这几个数的数值又是多少?");
System.out.print("请输入n的数值(n>=2):");
int n=input.nextInt(); //确定要求几个数的最大公约数和最小公倍数
while(n<2) //判断n个数的n是否小于2,输入数据的正确性验证
{
System.out.print("输入错误,请重新输入:");
n=input.nextInt();
}
while(k==1)
{
System.out.print("输入"+n+"个数字:");
for(i=0;i<n;i++)
{
a[i]=input.nextInt();
}
k=INSPECT(a,n); //判断输入的数字中是否有0
}
System.out.println("这"+n+"个数的最大公约数为:"+n_gcd(a,n));
System.out.println("这"+n+"个数的最小公倍数为:"+n_lcm(a,n));
}
//求两个数的最大公约数
static int two_gcd(int a,int b)
{
int temp;
if(a<b) //使得a大于b
{
temp=a;
a=b;
b=temp;
}
while(b!=0) //通过循环求两个数的余数
{ //直到余数为0
temp=a%b;
a=b;
b=temp;
}
return(a);
}
//求n个数的最大公约数
static int n_gcd(int a[],int n)
{int i;
int c=a[0];
for(i=1;i<n;i++) //用for循环 调用求两个最大公约数的函数来求n个数的最大公约数
{c=two_gcd(c,a[i]);}
return c;
}
//求两个数的最小公倍数
static int two_lcm(int x,int y)
{
return x*y/two_gcd(x,y);
}
//求n个数的最小公倍数
static int n_lcm(int a[],int n)
{
int i;
int s=1;
for(i=0;i<n;i++)
{s=two_lcm(s,a[i]);}
return s;
}
//判断输入的数字中是否有0 ,输入数据的正确性验证
static int INSPECT(int a[],int n) {
for(int i=0;i<n;i++)
{
if(a[i]==0)
{System.out.println("输入的数字中有0,错误!!!!");
return 1;
}
}
return 0;
}
}