求n个数的最大公约数及最小公倍数
一、题目分析
简单地说:就是求n个数的最大公约数、最小公倍数
复杂的说:还是求n个数的最大公约数、最小公倍数
哈哈哈,其实在之前的博客中列举了求解两个数的最大公约数的算法,
但是请注意这里的数据比较高大上一点,是n;
接下来:就是就是就是
我的分析思路:与大家共勉
(1)运用4种求解最大公约数算法写出求解两个数最大公约数的方法;
(2)调用求解两个数的最大公约数方法,对n个数依次进行两两比较;
(3)求解最小公倍数也是同理,先求出两个数的最小公倍数,再依次对n个数求解;
二、程序分析
1.程序组成:
1.1 两个类:
(1)Num类:求n个数的最大公约数、最小公倍数
(2)Test类:测试类
1.2 六个方法
1.2.1 int Max(int a, int b){}
功能:求两个数的最大公约数
/**
* @param: [a, b]
* @return: int
* @Description:求两个数的最大公约数(穷举法)
*/
public static int Max(int a, int b) {
int temp = a < b ? a : b;
while (temp > 0) {
if (a % temp == 0 && b % temp == 0) {
break;
}
temp--;
}
return temp;
}
1.2.2 int Min(int a, int b){}
功能:求两个数的最小公倍数
/**
* @param: [a, b]
* @return: int
* @Description:求两个数的最小公倍数
*/
public static int Min(int a, int b) {
return (a * b / Max(a, b));
}
1.2.3 int MaxDivisor(int[] array, int n){}
功能:求n个数的最大公约数
/**
* @param: [array, n]
* @return: int
* @Description:求n个数的最大公约数(递归实现)
*/
public static int MaxDivisor(int[] array, int n) {
int c = array[0];
for (int i = 1; i < n; i++) {
if (array[i] == 0) {
continue;
}
c = Max(c, array[i]);
}
return c;
}
1.2.4 int MinMultiple(int[] array, int n){}
功能:求n个数的最小公倍数
/**
* @param: [array, n]
* @return: int
* @Description:求n个数的最小公倍数(递归实现)
*/
public static int MinMultiple(int[] array, int n) {
int c = array[0];
for (int i = 1; i < n; i++) {
if (array[i] == 0) {
return array[i];
}
c = Min(c, array[i]);
}
return c;
}
1.2.5 int Input(int[] data, int n){}
功能:输入计算数的值
/**
* @param: [data, n]
* @return: int
* @Description:输入计算数的值
*/
public static int Input(int[] data, int n) {
int num;
if (n < 2) {
System.out.println("输入个数非法,请重新输入");
return 0;
}
System.out.println("请输入数字值:");
for (int i = 0; i < n; i++) {
System.out.println("输入" + (i + 1) + "个整数: ");
Scanner keyboard = new Scanner(System.in);
//当输入不是数字时,抛出异常-输入数据类型错误
try {
num = Integer.parseInt(keyboard.nextLine().trim());
data[i] = num;
} catch (NumberFormatException nfe) {
System.out.print("输入数据类型错误!你必须输入数值数据!\n");
return 0;
}
}
return 0;
}
1.2.6 int main(){}
public static void main(String[] args) {
int flag = 1;
Num num = new Num();
//建立循环,可多次选择计算
while(flag == 1){
System.out.print("请输入数字个数:");
int n = new Scanner(System.in).nextInt();
int[] data = new int[n];
if(n != 0){
//输入数据
num.Input(data,n);
System.out.println("最大公约数为:"+num.MaxDivisor(data,n));
System.out.println("最小公倍数为:"+num.MinMultiple(data,n));
}
System.out.println("继续计算选择1,退出选择0");
flag = new Scanner(System.in).nextInt();
}
}
2.流程图
三、调试
1.当输入个数时,输入非数字会出现异常
2.调试后,对非数字字符进行了处理
四、测试
1.个数非法
2.内容非法
五、运行结果
六、个人心得
在求n个数的最大公约数、最小公倍数的问题中,可以转化为对n个数依次两两进行求解的问题,虽然这个方法不是很优化,但是可以解决基本问题。期待我的脑洞大开,找出更优化的方法,哈哈哈