/**
* @author naru
* 编写时间: 2021年3月16日
* 类名:最大公约数和最小公倍数
* 题目描述:输入两个整数a和b,输出两个整数的最大公约数和最小公倍数,题目约定:
整数a和b既可以是正数、负数,也可以是零;
0和任何正数a的最大公约数都是a,0和任何负数a的最大公约数是-a,0和0的最大公约数是0;
0和任何数的最小公倍数都是0;
非零两个数的最大公约数和最小公倍数都是正数。例如-12和-18的最大公约数是6,最小公倍数是36
测试数据结果:
0和0的最大公约数为:0 0和0的最小公倍数为:0
0和6的最大公约数为:6 0和6的最小公倍数为:0
0和-6的最大公约数为:-6 0和-6的最小公倍数为:0
0和6的最大公约数为:6 0和6的最小公倍数为:0
1和10的最大公约数为:1 1和10的最小公倍数为:10
-1和-10的最大公约数为:1 -1和-10的最小公倍数为:10
-1和10的最大公约数为:1 -1和10的最小公倍数为:-10
1和-10的最大公约数为:1 1和-10的最小公倍数为:-10
34和35的最大公约数为:1 34和35的最小公倍数为:1190
-34和-35的最大公约数为:1 -34和-35的最小公倍数为:1190
-34和35的最大公约数为:1 -34和35的最小公倍数为:-1190
34和-35的最大公约数为:1 34和-35的最小公倍数为:-1190
12和18的最大公约数为:6 12和18的最小公倍数为:36
-12和-18的最大公约数为:6 -12和-18的最小公倍数为:36
-12和18的最大公约数为:6 -12和18的最小公倍数为:-36
12和-18的最大公约数为:6 12和-18的最小公倍数为:-36
5和20的最大公约数为:5 5和20的最小公倍数为:20
-5和-20的最大公约数为:5 -5和-20的最小公倍数为:20
-5和20的最大公约数为:5 -5和20的最小公倍数为:-20
5和-20的最大公约数为:5 5和-20的最小公倍数为:-20
91和7的最大公约数为:7 91和7的最小公倍数为:91
-91和-7的最大公约数为:7 -91和-7的最小公倍数为:91
-91和7的最大公约数为:7 -91和7的最小公倍数为:-91
91和-7的最大公约数为:7 91和-7的最小公倍数为:-91
*/
import java.util.Scanner;
public class 最大公约数和最小公倍数 {
/*
* 主函数只包括两个方法 Inputnum()和show(); Inputnum方法为输入两个数字 输出其最大公约数和最小公倍数
* show()方法为直接显示测试数据的最大公约数和最小公倍数
*/
public static void main(String[] args) {
//Inputnum();
show();
}
/*
* gcd(a,b)为求解a,b最大公约数的方法 利用辗转相除法先判断a,b中较大的一个数 然后让较大的数对较小的数求余
* 如果余数为零则较小的数即为二者的最大公约数 如果求余不为零则进行递归运算 让较小数对余数继续求余直到最终结果为零
* 当两数均小于0或其中一数小于0时,让a=-a b=-b 进行求解 a,b可以为整正数,负整数以及零 0和任何正数a的最大公约数都是a
* 0和任何负数a的最大公约数是-a 0和0的最大公约数是0 0和任何数的最小公倍数都是0 非零两个数的最大公约数和最小公倍数都是正数
*
*/
private static int gcd(int a, int b) {
if (a == 0 & b != 0)
return b;
if (b == 0 & a != 0)
return a;
if (a == 0 | b == 0)
return 0;
else if (a != 0 & b != 0) {
if (a < 0 & b < 0) {
a = -a;
b = -b;
}
if (a < 0 & b > 0) {
a = -a;
}
if (a > 0 & b < 0) {
b = -b;
}
if (a < b) {
int temp = a;
a = b;
b = temp;
}
if (a % b == 0)
return b;
else
return gcd(b, a % b);
}
return 1;
}
/*
* lcm(a,b)方法 返回a,b两数的最小公倍数 在gcd方法正常运行的前提下 a,b的最小公倍数计算公式为 (a*b)/gcd(a,b)
* 注意:当a,b中有一数为0时 二者的最小公倍数即为0
*/
private static int lcm(int a, int b) {
if (a != 0 && b != 0) {
int lcm = (a * b) / gcd(a, b);
return lcm;
} else {
if (a == 0 | b == 0)
return 0;
}
return 1;
}
/*
* Inputnum()方法 即引入Scanner类 从键盘读取两个数 然后求解两数的最大公约数和最小公倍数
*/
private static void Inputnum() {
Scanner reader = new Scanner(System.in);
System.out.println("请输入两个数字:");
int a = reader.nextInt();
int b = reader.nextInt();
int gcd = gcd(a, b);
int lcm = lcm(a, b);
System.out.printf("最大公约数为:%d", gcd);
System.out.printf("最小公倍数为:%d", lcm);
}
/*
* show()方法 输出gcd()和lcm()所返回的数值
* 引入int[][]类型的datas 测试数组 利用循环测试输出结果
*/
private static void show() {
int[][] datas = { { 0, 0 }, { 0, 6 },{0,-6},{-0,6},
{ 1, 10 },{-1,-10},{-1,10},{1,-10},
{ 34, 35 },{-34,-35},{-34,35},{34,-35},
{ 12, 18 }, {-12,-18},{-12,18},{12,-18},
{ 5, 20 },{-5,-20},{-5,20},{5,-20},
{ 91, 7 },{-91,-7},{-91,7},{91,-7},
};
for (int i = 0; i < datas.length; i++) {
int gcd = gcd(datas[i][0], datas[i][1]);
int lcm = lcm(datas[i][0], datas[i][1]);
System.out.printf("%d和%d的最大公约数为:%d",datas[i][0],datas[i][1],gcd);
System.out.printf("\t");
System.out.printf("%d和%d的最小公倍数为:%d", datas[i][0],datas[i][1],lcm);
System.out.println();
}
}
}
【java】求解最大公约数和最小公倍数(数组测试)
最新推荐文章于 2022-09-24 16:58:00 发布