最大公因子
题目:给定正整数m和n,求它们的最大公因子
输入:输入多组数据,每组数据一行,每行由两个正整数m和n组成,m和n最大不超过10000,以0 0作为结束
输出:输出m和n的最大公因子,每组数据占一行
输入:
4 8 12 16 0 0
输出:
4 4
public class Test { public static final void main(String[] args) { System.out.println("请输入两个正整数"); System.out.print("第一个正整数:"); Scanner scanner = new Scanner(System.in); String one = scanner.nextLine(); int a = Integer.valueOf(one); System.out.print("第二个正整数:"); String two = scanner.nextLine(); int b = Integer.valueOf(two); System.out.println("a = " + a + ", b =" + b); // 求最大公约数 // 1. a ÷ b,令temp为所得余数(0≤r<b) // 若 temp = 0,算法结束;b 即为答案。 // 2. 互换:置 a←b,b←temp,并返回第一步。 int temp, num1 = a, num2 = b; if (a < b) { // 互换位置 temp = b; b = a; a = temp; } System.out.println("a = " + a + ", b =" + b); while (b != 0) {/* 利用辗除法,直到b为0为止 */ temp = a % b; a = b; b = temp; } System.out.println("最大公约数:" + a); // 求最小公倍数 System.out.println("最小公倍数:" + num1 * num2 / a); } }
知识点
公因子
最大公因数,也称最大公约数、最大公因子,几个整数,公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。例如:12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数.
方法一: 辗转相除法: 如求(9, 15)的 最大公因子
9 / 15 = 0….9 15 / 9 = 1….6 9 / 6 = 1……3 6 / 3 = 2……0
像这样辗转相除, 直到出现余数为零停止, 那么最后的除数就是最大公因子, 即最大公因子等于 3
//辗转相除法 public static int method_one(int a, int b){ return a%b==0 ? b : method_one(b, a%b); }
方法二: 更相减损术:如求(9, 15)的 最大公因子 15 - 9 = 6 9 - 6 = 3 6 - 3 = 3 像这样一直用最大的数减去最小的数,直到被减数和差相等,那么减数就是最大公因子, 即最大公因子等于 3
//更相减损法 public static int method_two(int a, int b){ int minValue = a < b ? a : b; //a, b两个数中的最小值 int maxValue = a > b ? a : b; //a, b两个数中的最大值 return minValue == maxValue-minValue ? minValue method_four(minValue, maxValue-minValue); }
方法三: 短除法:短除法求最大公约数,先用这几个数的公约数连续去除,一直除到所有的商互质为止,然后把所有的除数连乘起来 ,所得的积就是这几个数的最大公约数。 如求(12, 24)的最大公因子 12 24 | 2 6 12 | 2 3 6 | 3 1 2 最后 1 和 2 都是质数, 最大公因子就等于 223 = 12
//短除法 static int max = 1; public static int method_three(int a, int b){ int minValue = a < b ? a : b; //a, b两个数中的最小值 for (int i=2; i<=minValue; i++){ if (a % i == 0 && b % i == 0){ max *= i; method_three(a/i, b/i); return max; } } return max; }
方法四: 从(a, b)中的最小值 (假设 这里为a) 开始从后往前依次遍历, 查找都能被b和a都整除的数,这个数就是 最大公因子. 如(9, 15)的最大公因子 9 , 8 , 7, 6, 5, 4, 3当循环到3的时候发现 9%3 等于零, 15%3等于零,那么 3 就是最大公因子
//普通方法 public static int method_four(int a, int b){ int minValue = a < b ? a : b; //a, b两个数中的最小值 for (int i=minValue; i>=2; i--){ if (a % i == 0 && b % i == 0){ return i; } } return i; }
求两点的距离
题目:输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离
输入:输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开
输出:对于每组输入数据,输出一行,结果保留两位小数
输入:
0 0 0 1 0 1 1 0
输出:
1.00 1.41
import java.awt.geom.Point2D; import java.util.Scanner; public class Test2 { public void run(){ System.out.println("请输入x,y的坐标"); Scanner scanner = new Scanner(System.in); // 输入n结束运行 while (!scanner.hasNext("n")) { // 获取两点坐标 double x1=scanner.nextDouble(); double y1=scanner.nextDouble(); double x2=scanner.nextDouble(); double y2=scanner.nextDouble(); // 计算输入两点距离 System.out.printf("%.2f\n",Point2D.distance(x1,y1,x2,y2)); } } public static void main(String[] args) { new Test2().run(); } }
知识点
java.awt.geom
java.awt.geom
是 Java 的一个图形类库,它提供了一些用于处理二维几何形状的接口和类。这些几何形状包括直线、曲线、矩形、椭圆等。java.awt.geom
包中的类和接口可以用于创建、操作和渲染这些几何形状。
以下是 java.awt.geom
包中的一些主要类和接口:
-
Point2D
- 表示二维空间中的一个点,有两个子接口:Point2D.Float
和Point2D.Double
,分别表示浮点坐标和双精度坐标。 -
Rectangle2D
- 表示二维空间中的一个矩形,有两个子接口:Rectangle2D.Float
和Rectangle2D.Double
,分别表示浮点坐标和双精度坐标。 -
Ellipse2D
- 表示二维空间中的一个椭圆,有两个子接口:Ellipse2D.Float
和Ellipse2D.Double
,分别表示浮点坐标和双精度坐标。 -
Line2D
- 表示二维空间中的一条线段,有两个子接口:Line2D.Float
和Line2D.Double
,分别表示浮点坐标和双精度坐标。 -
Path2D
- 表示二维空间中的一条路径,可以由多条线段和曲线组成。有两个子接口:Path2D.Float
和Path2D.Double
,分别表示浮点坐标和双精度坐标。 -
Arc2D
- 表示二维空间中的一个圆弧,有两个子接口:Arc2D.Float
和Arc2D.Double
,分别表示浮点坐标和双精度坐标。 -
QuadCurve2D
- 表示二维空间中的一条二次贝塞尔曲线。 -
CubicCurve2D
- 表示二维空间中的一条三次贝塞尔曲线。 -
Curve2D
- 表示二维空间中的一条曲线,可以是二次或三次贝塞尔曲线。 -
Shape
- 表示一个几何形状,可以是一个矩形、椭圆、路径等。这个接口提供了一些方法来获取形状的边界、计算形状的面积等。 -
Area
- 表示一个区域,可以用于计算两个形状的交集、并集等。 -
PathIterator
- 用于遍历一个路径上的点。 -
Path2D.Iterator
- 用于遍历一个Path2D
对象上的点。