【java】求解最大公约数和最小公倍数(数组测试)

/**
 * @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();
		}
		
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值