数组的最大公约数java_[编程入门]最大公约数与最小公倍数-题解(Java代码)

·知识&&分析:

更相减损术求两个数的最大公约数 :之前大的数 =(赋值) |两数差|(绝对值符号) ,直到两个数相等为止;所得的即为最大公因数利用各个数值之间的关

系求最小公倍数和最大公因数。同时:还可以运用更相减损术和辗转相除法,亦或短除法(比较简单)。

下面的代码(1)则是使用最初始的办法:

1:分解质因数

2:求公因数

(1):找到最大公因数

(2):用两数的积来除以公因数(每个公因数最多用两次)

(3):在(2)中,为了能够辨别是否已经,在求最小公倍数之前还要设置一个相应的布尔类型的数组

代码(2)则是短除法利用方法(1)和方法(2)还可以求出处最大的公有质因数

代码(4)是使用的更相减损术(较简单)

·最大公因数 = 公有的质因数的积

·在使用方法3时,应该明确知道:

1)最大公因数 * 最大公因数 * 短除后的余数1 * 余数2 = 两数积

2)最小公倍数 = 最大公因数 * 短处后的余数1 * 余数2

因而有:最小公倍数 = 最大公因数除两数的积

·以下的方法一个比一个简单,但是知识量越来越大,由下而上,步骤越详细

·显然,更相减损术的(4),(3)是最简单的,但是(1)是使用的技巧最多的

参考代码:(1)

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int[] array;

byte[] ij = new byte[]{0,0};

array = new int[2];

int[][] cFactor = new int[2][10];

boolean[] b = new boolean[10];                //用来判断下面的内层的相应的公质因数是否已经被用过

array[0] = scanner.nextInt();

array[1] = scanner.nextInt();

int[] x = new int[] {array[0],array[1]};

x[1] *= x[0];

x[0] = 1;

for(byte i = 0;i 

for(byte j = 2;array[i] != 1;) {

if(array[i]%j == 0) {

cFactor[i][ij[i]] = j;

array[i] /= j;

ij[i]++;

j = 2;

}

else {

j++;

}

}

}

for(byte m = 0;m 

for(byte n = 0;n 

if(cFactor[0][m]==cFactor[1][n] && (!b[n])) {   //关键点

b[n] = true;

x[0] *=cFactor[0][m];

x[1] /= cFactor[0][m];

}

}

}

System.out.println(x[0] +" "+ x[1]);

}

}

```

(2)//短除法

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int[] array;

int counter = 0;

array = new int[] {1,1,1};

int[] cFactor = new int[10];

array[0] = scanner.nextInt();

array[1] = scanner.nextInt();

for(byte i = 2;i = i ;) {

if(array[0] % i == 0 && array[1] % i == 0){

cFactor[counter] = i;

counter ++;

array[0] /= i;

array[1] /= i;

i = 2;

}

else {

i++;

}

}

for(byte i = 0;i 

array[2] *= cFactor[i];

array[0]*=cFactor[i];

}

System.out.print(array[2] + " " + array[0] * array[1]);

}

}

```

(3):

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int[] array;

array = new int[2];

array[0] = scanner.nextInt();

array[1] = scanner.nextInt();

if(array[0] 

int t = array[0];

array[0] = array[1];

array[1] = t;

}

for(int i = array[1];i > 0;i--) {

if(array[0] % i == 0&&array[1]%i == 0) {

System.out.print(i + " " + array[0] * array[1] / i);

break;

}

}

}

}

```

(4):

import java.util.Scanner;

import java.util.Arrays;                     //java数组头文件

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int[] array;

array = new int[2];

array[0] = scanner.nextInt();

array[1] = scanner.nextInt();

int x = array[0] * array[1];         //积 = 最大公约数 * 最小公倍数

Arrays.sort(array);

while(array[0] != array[1]) {          //循环相见求最大公约数

array[1] = array[1] - array[0];

Arrays.sort(array);             //位于Arrays中,排序方法是从默认从小到大

}

System.out.print(array[0] + " " + x / array[0]);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值